Как диспетчеризировать события в C#

Я хочу создать собственные события и диспетчеризировать их. Я никогда делавшийся это прежде в C#, только в Flex.. Я предполагаю, что должно быть много differencies.

Кто-либо может предоставить мне хороший пример?

19
задан Janov Byrnisson 15 March 2010 в 15:55
поделиться

4 ответа

Есть паттерн, который используется во всех библиотечных классах. Он рекомендуется и для ваших собственных классов, особенно для кода фреймворка/библиотеки. Но никто не остановит вас, если вы отклонитесь или пропустите несколько шагов.

Вот схема, основанная на простейшем событии-делегате, System.Eventhandler.

// The delegate type. This one is already defined in the library, in the System namespace
// the `void (object, EventArgs)` signature is also the recommended pattern
public delegate void Eventhandler(object sender, Eventargs args);  

// your publishing class
class Foo  
{
    public event EventHandler Changed;    // the Event

    protected virtual void OnChanged()    // the Trigger method, called to raise the event
    {
        // make a copy to be more thread-safe
        EventHandler handler = Changed;   

        if (handler != null)
        {
            // invoke the subscribed event-handler(s)
            handler(this, EventArgs.Empty);  
        }
    }

    // an example of raising the event
    void SomeMethod()
    {
       if (...)        // on some condition
         OnChanged();  // raise the event
    }
}

И как его использовать:

// your subscribing class
class Bar
{       
    public Bar()
    {
        Foo f = new Foo();
        f.Changed += Foo_Changed;    // Subscribe, using the short notation
    }

    // the handler must conform to the signature
    void Foo_Changed(object sender, EventArgs args)  // the Handler (reacts)
    {
        // the things Bar has to do when Foo changes
    }
}

И когда у вас есть информация для передачи:

class MyEventArgs : EventArgs    // guideline: derive from EventArgs
{
    public string Info { get; set; }
}

class Foo  
{
    public event EventHandler<MyEventArgs> Changed;    // the Event
    ...
    protected virtual void OnChanged(string info)      // the Trigger
    {
        EventHandler handler = Changed;   // make a copy to be more thread-safe
        if (handler != null)
        {
           var args = new MyEventArgs(){Info = info};  // this part will vary
           handler(this, args);  
        }
    }
}

class Bar
{       
   void Foo_Changed(object sender, MyEventArgs args)  // the Handler
   {
       string s = args.Info;
       ...
   }
}

Обновление

Начиная с C# 6 код вызова в методе 'Trigger' стал намного проще, нулевую проверку можно сократить с помощью оператора null-conditional ? без создания копии с сохранением потоковой безопасности:

protected virtual void OnChanged(string info)   // the Trigger
{
    var args = new MyEventArgs{Info = info};    // this part will vary
    Changed?.Invoke(this, args);
}
46
ответ дан 30 November 2019 в 02:33
поделиться

События в C # используют делегаты.

public static event EventHandler<EventArgs> myEvent;

static void Main()
{
   //add method to be called
   myEvent += Handler;

   //call all methods that have been added to the event
   myEvent(this, EventArgs.Empty);
}

static void Handler(object sender, EventArgs args)
{
  Console.WriteLine("Event Handled!");
}
3
ответ дан 30 November 2019 в 02:33
поделиться

Посмотрите на «делегатов».

  • Определите делегат
  • Используйте тип делегата как поле / свойство (добавив ключевое слово 'Event')
  • Теперь вы открываете события, к которым пользователи могут подключиться с помощью «+ = MyEventMethod;»

Надеюсь на это помогает,

0
ответ дан 30 November 2019 в 02:33
поделиться

Использование типичного шаблона событий .NET и предположение, что вам не нужны какие-либо специальные аргументы в вашем событии. Ваш типичный шаблон события и отправки выглядит следующим образом.

public class MyClassWithEvents
    {
        public event EventHandler MyEvent;

        protected void OnMyEvent(object sender, EventArgs eventArgs)
        {
            if (MyEvent != null)
            {
                MyEvent(sender, eventArgs);
            }
        }

        public void TriggerMyEvent()
        {
            OnMyEvent(sender, eventArgs);
        }
    }

Связывание чего-либо с событием может быть очень простым:

public class Program
{
    public static void Main(string[] args)
    {
        MyClassWithEvents obj = new MyClassWithEvents();

        obj.MyEvent += obj_myEvent;
    }

    private static void obj_myEvent(object sender, EventArgs e)
    {
        //Code called when my event is dispatched.
    }
}

Взгляните на ссылки на этой странице MSDN

3
ответ дан 30 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: