异步,Task.Delay 和 HtmlHelper MVC 4

4

奇怪的问题

不确定在测试类中执行Task.Delay后线程会发生什么。当它从静态Htmlhelper类中被调用时,我没有得到任何结果。当我在Task.Delay执行后进行调试时,线程没有命中返回语句。这是在asp.mvc 4中开发的。

视图代码

 <div>
    @Html.Method1().Result.ToString();
 </div>

Html助手

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

除了 Stephen 在他的回复中所说的之外,从 View 调用服务不符合 MVC 模式。 - Paulo Morgado
1个回答

8
你看到了我在博客中描述的死锁问题
从视图中调用任何异步代码都是一个坏主意;ASP.NET MVC 对可以在那个阶段调用的内容非常敏感。最好在控制器中完成所有异步工作,然后将包含结果的模型传递给视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接