私は最近 IAsyncResult に出くわしたばかりで、かなり長い間遊んでいます。私が実際に疑問に思っているのは、より優れた代替 ThreadPool があるのに、なぜ IAsyncResult を使用するのかということです。両方についての私の現在の理解から、私はほぼすべての状況で ThreadPool を使用することを選択します。だから私の質問は、 IAsyncResult が別のものよりも優先されるコンテキストはありますか?
私が IAsyncResult を好まない理由:
- BeginXXX と EndXXX で複雑さを追加
- 戻り値を気にしない場合、呼び出し元は EndXXX の呼び出しを忘れる可能性があります
- API 設計の冗長性の増加 (非同期で実行するすべてのメソッドに対して、Begin および End ラッパー メソッドを作成する必要があります)
- 可読性の低下
コードに入れるには:
スレッドプール
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" );
}