3

我正在开发一个 mvc3 项目,该项目使用的是进行异步调用的外部 sdk。我已经尝试了以下代码,但它不会等待我的任务完成。

public ActionResult Index()
    {
        var price = 0m;
        var t = Task.Factory.StartNew(() =>
                                          {
                                              // calculate price for example                                         });
                                          });
        t.Wait();
        ViewBag.price = price;
        return View();
    }

当我调试第一个断点是 ViewBag 中的价格设置,然后它进入任务。我究竟做错了什么?

4

1 回答 1

6

t.Wait()调用将阻止当前操作的执行,直到任务完成。在您的示例中,任务由您编写的匿名函数表示。当然,如果您在放置评论 ( // calculate price for example) 的位置放置了一些异步代码,该评论会立即返回,那么使用任务和等待就没有多大意义了。

所以我想这一切都取决于你在那里执行的具体任务。请记住,在 ASP.NET MVC 应用程序中阻塞主线程是一种非常糟糕的做法。我建议您查看一下asynchronous controllers,以优化 ASP.NET MVC 应用程序中异步任务的执行并充分利用 I/O 完成端口,以免危及工作线程。

这是一个示例,说明在您的情况下这种异步控制器的外观:

public class HomeController : AsyncController 
{
    public void IndexAsync() 
    {
        AsyncManager.OutstandingOperations.Increment();
        sdk.Items().GetAll(items => 
        {
            decimal price = items.Sum(i => i.Price); 
            AsyncManager.Parameters["price"] = price;
            AsyncManager.OutstandingOperations.Decrement();
        };
    }

    public ActionResult IndexCompleted(decimal price) 
    {
        // Oh Dude, please use view models and crap on this ViewBag shit
        ViewBag.price = price;
        return View();
    }
}
于 2013-02-09T22:09:24.973 回答