首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用WebClient UploadString()和UploadStringTaskAsync理解异步

用WebClient UploadString()和UploadStringTaskAsync理解异步
EN

Stack Overflow用户
提问于 2014-12-18 08:48:21
回答 2查看 3.9K关注 0票数 2

当异步与同步在非可视环境中运行时,例如Azure工作人员或Web Api控制器运行时,我很难理解异步与同步的好处:

代码语言:javascript
复制
using (var wc = new WebClient())
{
    wc.UploadString(uri, message);
    // vs.
    await wc.UploadStringTaskAsync(uri, message);
}

主线程不需要等待吗?因此它对性能没有影响吗?除了UI作业之外,还有什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-18 08:54:56

确实,即使您使用的是async,也有一些主线程在某个地方运行。好处是您可以并发地进行多个异步操作,而不阻塞任何线程。这增加了您的可伸缩性,因为您可以用更少的资源来处理更多的工作。

想象一下,您使用的不是单个WebClient,而是1000。在某个地方仍然有一个主线程,但是没有在IO上阻塞更多的1000个线程,而是没有使用任何线程。

代码语言:javascript
复制
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.
票数 3
EN

Stack Overflow用户

发布于 2014-12-18 08:52:42

主线程不需要等待吗?因此它对性能没有影响吗?除了UI作业之外,还有什么?

例如,当您使用Web时,ASP.NET线程池为您提供一个执行代码的线程。当您await一个异步方法时,您将该线程释放回池,以允许处理更多的连接。异步方法将控制权返回给调用方法(如果是顶级处理程序,则返回到线程池),现在线程可以自由地处理更多的工作了。在同步版本中,只需阻塞线程直到IO完成。

这样,即使不涉及UI,您也可以保持应用程序的响应性,使您能够同时处理更多的工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27542438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档