Создание пользовательского события

Можно ли создать пользовательское событие для любого метода объекта?
Чтобы сделать это, я просто использую следующий синтаксис ?:

myObject.myMethod +=new EventHandler(myNameEvent);

Следующий код вызвал этот вопрос:

   private void btRunProcessAndRefresh_Click(object sender,EventArgs e)
    {
        myProcess =new Process();
        myProcess.StartInfo.FileName = @"c:\ConsoleApplication4.exe";
        myProcess.Exited += new EventHandler(MyProcessExited);
        myProcess.EnableRaisingEvents =true;
        myProcess.SynchronizingObject =this;
        btRunProcessAndRefresh.Enabled =false;
        myProcess.Start();
    }
 Default27 мар. 2012 г., 10:15
Обратите внимание, чтоmyProcess.Exited += MyProcessExited; достаточно.
 Pranay Rana25 апр. 2012 г., 08:11
не забудьте пометить ответ как принятый, если он работает для вас ...
 Default27 мар. 2012 г., 13:41
даnew EventHandler() избыточно
 whytheq27 мар. 2012 г., 12:59
@ По умолчанию ааааа .... так что я мог быmyProcess.Exited +=new EventHandler(MyProcessExited); ИЛИ я могу объявить событие, а затем использоватьmyProcess.Exited += MyProcessExited; ?
 Default27 мар. 2012 г., 10:05
проверитьПример MSDN событий

Ответы на вопрос(6)

Объявите класс, содержащий событие:

class MyClass {
    public event EventHandler MyEvent;

    public void Method() {
        OnEvent();
    }

    private void OnEvent() {
        if (MyEvent != null) {
            MyEvent(this, EventArgs.Empty);
        }
    }
}

Используйте это так:

MyClass myObject = new MyClass();
myObject.MyEvent += new EventHandler(myObject_MyEvent);
myObject.Method();
 whytheq05 нояб. 2013 г., 21:19
+1 хороший простой пример - спасибо

если у вас есть доступ к определению объекта и вы можете изменить его, чтобы объявить пользовательское событие

public event EventHandler<EventArgs> ModelChnaged;

И обычно вы бы подкрепили это закрытым методом, используемым внутри для вызова события:

private void OnModelChanged(EventArgs e)
{
    if (ModelChnaged != null)
        ModelChnaged(this, e);
}

Ваш код просто объявляет обработчик для объявленногоmyMethod событие (вы также можете удалить конструктор), которое будет вызываться каждый раз, когда объект вызывает событие.

myObject.myMethod += myNameEvent;

Точно так же вы можетеотрывать обработчик, использующий

myObject.myMethod -= myNameEvent;

Кроме того, вы можете написать свой собственныйподклассEventArgs предоставить конкретные данные, когда ваше событие срабатывает.

 Bernard Notarianni14 апр. 2014 г., 17:47
Просто и элегантно.
 user68826 июл. 2017 г., 13:56
Я пытался как, но событие не сработало

вызов делегату может быть упрощен с помощьюнулевое распространение начиная с C # 6.0.

Ваш код будет просто:

class MyClass {
    public event EventHandler MyEvent;

    public void Method() {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }
}

Используйте это так:

MyClass myObject = new MyClass();
myObject.MyEvent += new EventHandler(myObject_MyEvent);
myObject.Method();

public event EventHandler<EventArgs> myMethod; //you should name it as an event, like ObjectChanged.

тогда myNameEvent - это обратный вызов для обработки события, и он может быть в любом другом классе.

 whytheq27 мар. 2012 г., 10:04
хорошо, но вопрос был вдохновлен некоторым кодом, который я анализирую. Я добавлю код к вопросу. Я не вижу никакой декларации.
 MBen27 мар. 2012 г., 12:00
Хорошо, если вы нажмете перейти к определению Exited, это должно быть событие, а затем код обработки находится в MyProcessExited.
Решение Вопроса

Создание расширенных пользовательских событий C #

или же

Самый простой пример C # Events Imaginable

public class Metronome
{
    public event TickHandler Tick;
    public EventArgs e = null;
    public delegate void TickHandler(Metronome m, EventArgs e);
    public void Start()
    {
        while (true)
        {
            System.Threading.Thread.Sleep(3000);
            if (Tick != null)
            {
                Tick(this, e);
            }
        }
    }
}
public class Listener
{
    public void Subscribe(Metronome m)
    {
        m.Tick += new Metronome.TickHandler(HeardIt);
    }

    private void HeardIt(Metronome m, EventArgs e)
    {
        System.Console.WriteLine("HEARD IT");
    }
}
class Test
{
    static void Main()
    {
        Metronome m = new Metronome();
        Listener l = new Listener();
        l.Subscribe(m);
        m.Start();
    }
}
 whiteshooz17 мая 2013 г., 01:48
Вот еще один простой пример:msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx
 Default27 мар. 2012 г., 10:14
Так-то лучше :)
 Default27 мар. 2012 г., 10:03
это не похоже на самый простой пример для меня.
 Pranay Rana27 мар. 2012 г., 10:05
@Default - проверить первую ссылку с самым простым примером
 Apalabrados14 июн. 2017 г., 17:48
@PranayRana Что такое HeardIt?

public class Foo
{
    public delegate void MyEvent(object sender, object param);
    event MyEvent OnMyEvent;

    public Foo()
    {
        this.OnMyEvent += new MyEvent(Foo_OnMyEvent);
    }

    void Foo_OnMyEvent(object sender, object param)
    {
        if (this.OnMyEvent != null)
        {
            //do something
        }
    }



    void RaiseEvent()
    {
        object param = new object();
        this.OnMyEvent(this,param);
    }
}
 daryal27 мар. 2012 г., 10:14
когда вы смотрите на EventHandler, это просто конкретный делегат.
 whytheq27 мар. 2012 г., 10:12
Я смотрю на некоторые другие предоставленные примеры, и они не включают «делегат» - с которым я не сталкивался ранее
 kdbanman20 авг. 2015 г., 02:44
для объяснения, вы должны использовать пользовательский делегат обработчика событий, только если вам нужны параметры, отличные от тех, которые используются дляEventHandler или жеEventHandler<>, ВидетьВот для деталей.

Ваш ответ на вопрос