У меня есть поток с высоким приоритетом, который предлагает некоторые события, которые сообщают о его действиях:
public event EventHandler<EventArgs> Connecting;
private _MyMethod()
{
// ...some code
OnConnecting(my_event_args);
// ...more code
}
Поток не должен блокироваться какой-либо обработкой, выполняемой в методе обработки событий подписчика, как это происходит собычная ванильная обработка событий:
protected virtual void OnConnecting(EventArgs e)
{
EventHandler<EventArgs> temp = Connecting; // for thread-safety
if (temp != null) temp(this, e); // execute subscriber within "my" thread
}
Первое решение - просто передать событие (делегат) в виде лямбды на Task.Run
:
protected virtual void OnConnecting(EventArgs e)
{
EventHandler<EventArgs> temp = Connecting; // for thread-safety
if (temp != null) Task.Run(() => temp(this, e));
}
Я ошибаюсь, или это неявно последовательностьвсе абоненты в непараллельном порядке выполнения, как бы звонить им напрямую?Является ли следующая версия разумным способом размещения всех подписчиков параллельно в Threadpool?
protected virtual void OnConnecting(EventArgs e)
{
foreach (var t in Connecting.GetInvocationList()) Task.Run(()=>t.DynamicInvoke(this,e));
}
Кроме того, где-то я читал, что лямбды не так производительны, как простой вызов делегата, есть ли способ получитьизбавиться от этого или рекомендация была неправильной?