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/