Я недавно встретил IAsyncResult и играл с ним довольно долгое время. На самом деле я задаюсь вопросом, зачем использовать IAsyncResult, когда у нас есть лучший альтернативный ThreadPool? Из моего нынешнего понимания обо всех из них я бы предпочел использовать ThreadPool практически в каждой ситуации. Итак, мой вопрос: есть ли какой-либо контекст, где IAsyncResult предпочтительнее другого?
Почему я не предпочитаю IAsyncResult:
- Добавлена сложность с BeginXXX и EndXXX
- Caller может забыть вызывать EndXXX, если он не заботится о возвращаемом значении
- Увеличение избыточности в дизайне API (нам нужно создать методы обхода Begin и End для всех методов, которые мы хотим запустить асинхронно)
- Уменьшенная читаемость
Чтобы поместить его в код:
ThreadPool
public void ThreadPoolApproach()
{
ThreadPool.QueueUserWorkItem( ( a ) =>
{
WebClient wc = new WebClient();
var response = wc.DownloadString( "http://www.test.com" );
Console.WriteLine( response );
} );
}
IAsyncResult
public void IAsyncResultApproach()
{
var a = BeginReadFromWeb( ( result ) =>
{
var response = EndReadFromWeb( result );
Console.WriteLine( response );
}, "http://www.test.com" );
}
public IAsyncResult BeginReadFromWeb( AsyncCallback a, string url )
{
var result = new AsyncResult<string>( a, null, this, "ReadFromFile" );
ThreadPool.QueueUserWorkItem( ( b ) =>
{
WebClient wc = new WebClient();
result.SetResult( wc.DownloadString( url ) );
result.Complete( null );
} );
return result;
}
public string EndReadFromWeb( IAsyncResult result )
{
return AsyncResult<string>.End( result, this, "ReadFromFile" );
}