Правильный способ завершить BeginInvoke?

Недавно я прочитал эту тему в 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);

Ответ 1

Ваш второй пример немного более эффективен, потому что экземпляр делегата "метод" не должен быть зафиксирован в закрытии. Я сомневаюсь, что вы когда-нибудь заметили.

Ответ 2

Я не знаю, возможно ли это в январе 2009 года, но теперь вы можете просто написать это:

method.BeginInvoke(5, method.EndInvoke, null);

Ответ 3

Возможно, вы захотите прочитать эту тему в блоге Haacked. У меня не было возможности проверить его, но суть в одной из последних строк:

ThreadPool.QueueUserWorkItem(callback => im.Send(to, from, subject, body));