当异步与同步在非可视环境中运行时,例如Azure工作人员或Web Api控制器运行时,我很难理解异步与同步的好处:
using (var wc = new WebClient())
{
wc.UploadString(uri, message);
// vs.
await wc.UploadStringTaskAsync(uri, message);
}主线程不需要等待吗?因此它对性能没有影响吗?除了UI作业之外,还有什么?
发布于 2014-12-18 08:54:56
确实,即使您使用的是async,也有一些主线程在某个地方运行。好处是您可以并发地进行多个异步操作,而不阻塞任何线程。这增加了您的可伸缩性,因为您可以用更少的资源来处理更多的工作。
想象一下,您使用的不是单个WebClient,而是1000。在某个地方仍然有一个主线程,但是没有在IO上阻塞更多的1000个线程,而是没有使用任何线程。
public Task Upload(string message)
{
using (var wc = new WebClient())
{
wc.UploadString(uri, message);
// vs.
await wc.UploadStringTaskAsync(uri, message);
}
}
await Task.WhenAll(messages.Select(message => Upload(message))) // multiple operations. 0 blocked threads.发布于 2014-12-18 08:52:42
主线程不需要等待吗?因此它对性能没有影响吗?除了UI作业之外,还有什么?
例如,当您使用Web时,ASP.NET线程池为您提供一个执行代码的线程。当您await一个异步方法时,您将该线程释放回池,以允许处理更多的连接。异步方法将控制权返回给调用方法(如果是顶级处理程序,则返回到线程池),现在线程可以自由地处理更多的工作了。在同步版本中,只需阻塞线程直到IO完成。
这样,即使不涉及UI,您也可以保持应用程序的响应性,使您能够同时处理更多的工作。
https://stackoverflow.com/questions/27542438
复制相似问题