Ответ 1
Вторая форма, используя IAsyncResult
, значительно старше и намного менее мощна. Task<T>
был введен в .NET 4 и является предпочтительным способом представления асинхронных операций. Это гораздо проще в использовании, особенно в С# 5, который поддерживает "асинхронные функции", где вы можете ожидать задачи (или другую асинхронную операцию) неблокирующим способом.
Использование Task
вместо вызова BeginInvoke
, вероятно, не будет сильно изменяться о том, как выполняется сама операция (хотя она дает больше возможностей с точки зрения планирования и т.д.), но она существенно отличается от перспективы кода, который хочет "наблюдать" за операцией, использовать результаты, ждать нескольких задач, обрабатывать сбои и т.д.
Если вы можете использовать С# 5 (либо с .NET 4.5, либо с .NET 4 плюс пакет асинхронного таргетинга), это значительно упростит вашу жизнь, когда дело доходит до управления асинхронными операциями. Это путь вперед:)