【问题标题】:MVC 3 Task WaitMVC 3 任务等待
【发布时间】:2013-02-09 22:06:30
【问题描述】:

我正在开发一个 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 中的价格设置,然后它进入任务。我做错了什么?

【问题讨论】:

  • +1,现在您可以将功劳归功于回答您的问题的人

标签: c# asp.net asp.net-mvc-3 task


【解决方案1】:

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

【讨论】:

  • 以上,没有太多的开始任务并立即等待其完成。
  • 是的,完全同意。这在 ASP.NET 应用程序中可能是灾难性的。
  • 匿名函数中的代码如下: price = sdk.Items().GetAll((items)=>{price =items.Sum( i => i.Price); }) ; GetAll 方法是异步的,这就是我需要等待任务完成的原因。我已经尝试过异步控制器并且我会使用它,但我仍然不明白为什么我的线程没有被 t.Wait() 阻塞?
  • 如果 GetAll 方法是异步的,那么您绝对不需要任何任务。他们根本不会帮助你。你让事情变得更糟。如果 GetAll 方法没有为您提供等待其执行结束的方法,您可以使用异步控制器。请阅读我在回答中提供的链接。我还更新了我的答案,为您提供一个可以帮助您入门的示例。
  • 是的,谢谢,我已经尝试过了,它正在做我的工作,但我只是想知道为什么这段代码不起作用。使用 GetAll 方法我唯一能做的就是传递回调函数,我将在其中获得结果项
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2015-02-02
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多