【发布时间】:2014-01-22 09:14:13
【问题描述】:
我最近刚刚接触到 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" );
}
【问题讨论】:
-
哇哦...如果您对自己放在这里的内容如此兴奋...等到您到达
Tasks 和async/await。 -
这里没有区别,因为您在第二个示例中仍然使用 ThreadPool 同步下载(在持续时间内阻塞线程)。当您在整个过程中使用异步调用,WebClient.DownloadStringAsync、HttpWebRequest.BeginGetResponse、Stream.BeginRead 等时,优势就会变得明显。
-
与async的巨大区别在于,等待数据不会阻塞线程池线程,只有在接收或发送数据时,才会调用线程池上的endreceive。
标签: c# threadpool iasyncresult