Ответ 1
Ваш второй пример немного более эффективен, потому что экземпляр делегата "метод" не должен быть зафиксирован в закрытии. Я сомневаюсь, что вы когда-нибудь заметили.
Недавно я прочитал эту тему в MSDN. Поэтому я думал об использовании выражения лямбды как способа позвонить EndInvoke, как способ убедиться, что все красиво и аккуратно. Что было бы правильнее?
пример 1:
Action<int> method = DoSomething;
method.BeginInvoke(5, (a)=>{method.EndInvoke(a);}, null);
Пример 2:
Action<int> method = DoSomething;
method.BeginInvoke(5, (a)=>
{
Action<int> m = a.AsyncState as Action<int>;
m.EndInvoke(a);
}, method);
Ваш второй пример немного более эффективен, потому что экземпляр делегата "метод" не должен быть зафиксирован в закрытии. Я сомневаюсь, что вы когда-нибудь заметили.
Я не знаю, возможно ли это в январе 2009 года, но теперь вы можете просто написать это:
method.BeginInvoke(5, method.EndInvoke, null);
Возможно, вы захотите прочитать эту тему в блоге Haacked. У меня не было возможности проверить его, но суть в одной из последних строк:
ThreadPool.QueueUserWorkItem(callback => im.Send(to, from, subject, body));