奇怪的问题
在测试类中执行Task.Delay后,不确定线程会发生什么。当它从静态Htmlhelper类调用时,我没有得到任何结果,当我在Task.Delay执行后调试它时,线程没有达到return语句。这是在asp.mvc 4中开发的。
查看代码
<div>
@Html.Method1().Result.ToString();
</div>
Html Helper
public static class SomeHtmlHelper
{
public static async Task<string> Method1(
this HtmlHelper htmlHelper)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var testObj = new test();
var a = testObj.Service1Async();
var b = testObj.Service2Async();
await Task.WhenAll(a,b);
stopwatch.Stop();
return "<div>"+stopwatch.Elapsed.ToString()+"</div>";
}
}
异步工作
public class test
{
public async Task<int> Service2Async()
{
await Task.Delay(2000);
return 10;
}
public async Task<int> Service1Async()
{
await Task.Delay(2000);
return 10;
}
}
如果来自控制器的调用
,相同的代码(测试类)可以正常工作public class HomeController : Controller
{
public async Task<ActionResult> About()
{
ViewBag.Message = "Your app description page.";
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
var testObj = new test();
var a = testObj.Service1Async();
var b = testObj.Service2Async();
await Task.WhenAll(a, b);
stopwatch.Stop();
var millisec = stopwatch.Elapsed.ToString();
return View();
}
}
答案 0 :(得分:8)
您在我的博客上看到了deadlock issue。
从视图中调用任何异步代码是个坏主意; ASP.NET MVC对于在该阶段可以调用的内容非常敏感。最好在控制器中执行所有异步工作,然后将包含结果的模型传递给视图。