Поточная обработка и лямбда-выражения

Каково различие между двумя частями кода ниже? Будут какие-либо проблемы с помощью второй?

Сценарий 1:

private void Log(Exception e)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(Log), e);
}

private void Log(object obj)
{
    Exception e = (Exception)obj;
    Logger.Log(e);
}

Сценарий 2

private void Log(Exception e)
{
    ThreadPool.QueueUserWorkItem(
        (obj) => 
            {
                Logger.Log(e);
            });
}

В сценарии 2 я не передаю исключение в как параметр в ThreadPool. Как делает маршалинг потока объекта исключения, происходят? Будут какие-либо проблемы? Каковы ограничения выполнения этого если таковые имеются? Большое преимущество состоит в том, что можно передать в любом количестве параметров очень легко.

10
задан LOZ 14 August 2012 в 05:40
поделиться

2 ответа

Единственное отличие состоит в том, что во втором сценарии вы закрываете переменную e , которая эффективно перемещает переменную стека e в настраиваемый тип, который перемещается в кучу, поэтому вы не потеряете его.

Я думаю, это должно работать нормально.

Edit: Что касается производительности, нет, не должно быть значительной разницы между двумя сценариями. В сценарии 1 вы уже передаете исключение как состояние методу QueueUserWorkItem , который внутренне перемещает ссылку на исключение в кучу. Единственные накладные расходы заключаются в том, что при использовании замыкания компилятор создает для вас тип и сохраняет любые захваченные переменные как поля этого типа.

14
ответ дан 3 December 2019 в 22:38
поделиться

Just to note, instead of the Lambda, you could do the same with an anonymous method, and it would also work in C# 2.0:

ThreadPool.QueueUserWorkItem(delegate(Object e) 
    { 
        Logger.Log(e as Exception); 
    });
1
ответ дан 3 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

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