- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用此异步代码来测试异步关键字:
public async Task<string> AsyncMethod()
{
var link = "http://www.google.com";
var webclient = new WebClient();
var result = await webclient.DownloadStringTaskAsync(new Uri(link));
return result;
}
public async Task<ActionResult> Index()
{
var a = AsyncMethod();
var b = AsyncMethod();
Task.WaitAll(a, b);
return View();
}
但是当我调试它时,调试器会触发 Task.WaitAll
并且什么都不做(返回键永远不会执行)..如果我在两个“AsyncMethod”之前设置 await 并删除 Task.WaitAll
它会起作用。那么我做错了什么?
最佳答案
因为您的方法看起来像 ASP.NET MVC Controller 操作,所以我假设您正在 ASP.NET 上运行。
默认情况下,异步方法会在它暂停的同一上下文中恢复(即您调用 await
的地方)。在 ASP.NET 中,这意味着当前请求上下文。并且一次只能有一个线程处于特定上下文中。因此,发生的情况是执行 Index()
的线程在请求上下文中,被阻塞在 WaitAll()
中。另一方面,AsyncMethod()
的两次调用都试图在同一上下文中恢复(在完成下载后),但它们无法这样做,因为 Index()
仍在该上下文中执行。因此,这些方法位于 deadlock 中。所以什么也没有发生。
(同样的死锁也会发生在 GUI 应用程序中,因为 GUI 上下文在这方面的行为相似。控制台应用程序没有这个问题,因为它们没有任何上下文。)
解决这个问题有两个方面:
永远不要同步等待 async
方法。 (可能唯一的异常(exception)是如果想从控制台应用程序的 Main()
方法执行异步方法。)
相反,异步等待它们。在您的情况下,这意味着使用 await Task.WhenAll(a, b)
。
在您的“库”方法中使用 ConfigureAwait(false)
(即那些实际上不需要在请求上下文中执行的方法)。
使用 1 或 2 可以解决您的问题,但最好同时进行。
有关此问题的更多信息,请阅读 Stephen Cleary 的文章 Don't Block on Async Code .
关于c# - Task.WaitAll 一直在循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14046471/
我有一个在 Android 市场上相当流行的应用程序,它允许数以万计的用户按下一个按钮并向它发出语音命令。然后我就可以做很多不同的事情,比如给他们提供当前的天气预报等等...... 无论如何,我的应用
令人惊讶的是,标题基本上解释了它。我们有一个我们的客户制作的页面,我们正在重新创建该页面。 页面高度会一直增加,直到(我假设是这样)浏览器达到它的极限。我已经尝试过 Firebug 和 W3 验证器,
我是 react-native 的新手,试图创建我自己的组件,但它一直显示一个空屏幕。 这是我的组件代码 class BoxComponent extends Component { cons
我正在为我的 PHP 元素创建一个非常简单的博客,但遇到了一个简单的问题。我无法让我的页眉图像一直 float 。我有一个横幅,左边有一些文字,我有一个 1px 的切片,在可以选择的任何分辨率的宽度上
为什么我可以在另一个 Controller 的 View 中访问一个 Controller 的辅助方法?有没有办法在不破解/修补 Rails 的情况下禁用它? 最佳答案 @George Schreib
我正在使用带有最新 ADT 插件的 Eclipse Kepler SP2。每隔一分钟 Eclipse 就会说“为 Android 4.4.2 加载数据”并阻止我想做的一切。我在不同的文件夹中有几个 E
我是一名优秀的程序员,十分优秀!