3

非同期呼び出しを行う外部 SDK を使用している mvc3 プロジェクトに取り組んでいます。次のコードを試しましたが、タスクが完了するのを待ちません。

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 controllersASP.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 に答える