我有一个 ASP.NET 应用程序。我正在对它进行负载测试,我设法通过使用外部工具运行并发请求来阻止线程池中的所有线程。由于网络上的 I/O 请求,所有线程都被阻塞,这样做的方法是用 async 和 await 关键字实现的。我在另一个 Controller 中还有另一个方法,它只返回一个字符串,也就是说,第二个方法不执行 I/O。
问题是:即使所有线程都在执行异步 I/O,是否应该处理对这种非阻塞方法的所有请求?
最佳答案
当调用一个实现为异步的方法时仍然可以阻塞。
public async Task GetFooAsync()
{
await DoSomethingElseAsync();
}
public static void MySyncMethod()
{
GetFooAsync().Wait();
}
通过调用 .Wait()
,我阻塞了线程。使用 async/await 实现该方法并不重要。 .Result
异步方法需要“一直异步”使用——这意味着整个调用堆栈必须是异步的才能成为非阻塞的。在 ASP.NET 应用程序中,这意味着您从 Controller 中的异步方法开始。如果 Controller 方法是同步的,调用异步方法仍然会阻塞。
参见 this MSDN article 中的“一路异步” .您可能还希望观看这些 essential tips for async/await on Channel 9 .
关于c# - ASP.NET 异步和等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32639693/