Как использовать задачи для упрощения делегирования.BeginInvoke /Делегат.Завершение вызова?

#c# #events #asynchronous #delegates #task

#c# #Мероприятия #асинхронный #делегаты #задача

Вопрос:

Пытаюсь разобраться в классе Tasks, а точнее, в Task.Factory.FromAsync методе.

В настоящее время в моем коде я делаю что-то вроде этого:

 var handler = MyEvent;

if (handler != null)
{
    handler.Invoke(this, e);
}
  

К сожалению, это синхронно, и я ищу асинхронную версию. Я мог бы использовать BeginInvoke и EndInvoke, но это кажется пустой тратой времени, учитывая, что мне не нужен обратный вызов. Кажется, я где-то слышал, что можно использовать одну из задач.Фабричные методы для упрощения этого вызова, когда фиктивный обратный вызов тогда не нужен. Кто-нибудь может меня просветить?

Ответ №1:

Несколько необычно вызывать обработчики событий асинхронно; если обработчик хочет обработать событие асинхронно, он должен сам запустить задачу.

Вы можете запустить задачу с помощью задачи.Метод Factory.StartNew*:

 void MyClass_MyEvent(object sender, EventArgs e)
{
    Task.Factory.StartNew(() =>
    {
        // do work
    });
}
  

(* или метод Task.Run в асинхронном CTP или .NET 4.5)

Комментарии:

1. Спасибо за ответ. // do work В основном будет заменен примером кода, который я использовал в своем исходном сообщении?

2. Мой код — это обработчик события, а не код, который вызывает событие.