C# 等待和异步使用
for await和async给出了以下简单示例C# 等待和异步使用,c#,async-await,C#,Async Await,for await和async给出了以下简单示例 async Task<int> AccessTheWebAsync() { HttpClient client = new HttpClient(); Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com"); DoIndependentWork(); string urlCont
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;
}
但是,如果在调用方法和完成方法之间没有工作要做,那么使此方法异步有什么好处?当您等待异步方法时,线程将被释放以执行其他工作。在同步版本中,该线程将被阻塞。当您等待异步方法时,该线程将被释放以执行其他工作。在同步版本中,该线程将被阻塞。wait关键字意味着启动GetStringAsync方法的线程可能在该方法执行期间变为空闲线程 例如,假设这是一个web服务器,例如,线程池中有10个线程,负责处理请求。在这种情况下,在GetStringAsync调用开始和结束之间,线程可以自由地执行其他操作 这意味着即使有10个线程,您也可以以非常有效的方式为10个以上的用户提供服务。如果代码中没有wait,GetStringAsync也不是异步的,但是一个阻塞同步方法和11个用户将同时访问它,那么其中一个用户将遇到问题,因为没有空闲线程来处理11个。请求 如果该调用是一个阻塞同步代码,那么执行将停留在那里,什么也不做,而网卡将只等待来自服务器的HTTP响应。因此,使用await基本上可以避免只等待而不执行任何操作的线程。await关键字意味着启动GetStringAsync方法的线程在该方法的执行过程中可能会变得空闲 例如,假设这是一个web服务器,例如,线程池中有10个线程,负责处理请求。在这种情况下,在GetStringAsync调用开始和结束之间,线程可以自由地执行其他操作 这意味着即使有10个线程,您也可以以非常有效的方式为10个以上的用户提供服务。如果代码中没有wait,GetStringAsync也不是异步的,但是一个阻塞同步方法和11个用户将同时访问它,那么其中一个用户将遇到问题,因为没有空闲线程来处理11个。请求
如果该调用是一个阻塞同步代码,那么执行将停留在那里,什么也不做,而网卡将只等待来自服务器的HTTP响应。因此,使用await基本上可以避免只等待而不执行任何操作的线程。一般来说,Async await消耗较少的线程,通过减少内存/线程使用来提高可伸缩性。 与同步代码相比,它还提高了响应速度
检查一般情况下,Async Await消耗的线程较少,通过减少内存/线程使用来提高可伸缩性。 与同步代码相比,它还提高了响应速度
选中,因为方法执行本身仍然是异步的,所以调用该段代码的代码UI仍然是响应的。这只意味着,因为没有块独立工作,所以没有理由先缓冲任务。谢谢你的回答,你的意思是说每个访问WebAsync的人都被UI调用了?这意味着整个UI必须在等待getStringTask?中等待,因为方法执行本身仍然是异步的,所以调用该代码段的代码UI仍然是响应的。这只意味着,因为没有块独立工作,所以没有理由先缓冲任务。谢谢你的回答,你的意思是说每个访问WebAsync的人都被UI调用了?这意味着整个UI将不得不等待等待getStringTask?顺便说一句,我写了一篇关于这一点的博文,解释了在async/await之后发生的所有事情:顺便说一句,我写了一篇关于这一点的博文,解释了在async/await之后发生的所有事情:这就是这个问题的重点。自由做其他工作。做什么?没有其他工作了。事实上,所有的线索都在等待着,这就是这个问题的关键所在。自由做其他工作。做什么?没有其他工作了。事实上,整个线程都在等待。
string urlContents = await client.GetStringAsync();