Запуск подписчиков события в виде задач в Threadpool - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть поток с высоким приоритетом, который предлагает некоторые события, которые сообщают о его действиях:

    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));
    }

Кроме того, где-то я читал, что лямбды не так производительны, как простой вызов делегата, есть ли способ получитьизбавиться от этого или рекомендация была неправильной?

...