c# - 等待和异步用法

标签 c# async-await

MSDN documentation对于 await 和 async 给出了以下简单示例。

async Task<int> AccessTheWebAsync()
{ 

    HttpClient client = new HttpClient();

    Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");

    DoIndependentWork();

    string urlContents = await getStringTask;

    return urlContents.Length;
}

然后说:

If AccessTheWebAsync doesn't have any work that it can do between calling GetStringAsync and awaiting its completion, you can simplify your code by calling and awaiting in the following single statement.

string urlContents = await client.GetStringAsync();

但是如果在调用该方法和完成该方法之间没有任何工作要做,那么使该方法异步的好处是什么?

最佳答案

await 关键字意味着启动 GetStringAsync 方法的线程可能会在该方法执行期间变得空闲。

例如,假设这是一个网络服务器(例如,线程池中有 10 个线程,负责处理请求)。在这种情况下,从 GetStringAsync 调用开始到结束,线程可以自由地做其他事情。

这意味着即使有 10 个线程,您也可以以非常有效的方式为 10 个以上的用户提供服务。如果您的代码中没有 await(并且 GetStringAsync 不会是异步的,而是阻塞同步方法)并且 11 个用户将同时访问它,那么其中一个他们会有麻烦,因为没有空闲线程来处理 11. 请求。

如果该调用是一个阻塞同步代码,那么执行将停留在那里什么都不做,而您的网卡将只等待来自服务器的 HTTP 响应。因此,基本上使用“await”可以避免只等待而什么都不做的线程。

关于c# - 等待和异步用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34020235/

相关文章:

c# - 如何使用 NHibernate 和 Envers 交换唯一的、排序的列条目?

c# - 在自定义 Web 控件中显示可能的属性值

c# - ObserveOn 与修改代码以在主线程上运行

c# - C#中的匿名 block

c# - 处理异步方法的取消

javascript - 异步为 TestCafe 创建动态测试

c# - Task.ContinueWith 在非异步方法中的性能与使用 async/await 的对比

c# - 为什么 WPF Presentation 库在 StringBuilder.ToString() 中包装字符串?

c# - 如何在 C# 中调用 async void 事件处理程序?

c# - 无法在新任务中填充数据网格