Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待和异步使用_C#_Async Await - Fatal编程技术网

C# 等待和异步使用

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

for 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;
}

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

当您等待异步方法时,线程将被释放以执行其他工作。在同步版本中,该线程将被阻塞。

当您等待异步方法时,该线程将被释放以执行其他工作。在同步版本中,该线程将被阻塞。

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();