0

非同期コントローラーで非同期アクションを作成しようとしています。私がする必要があるのは、ビューでボタンを押すと、作業が完了のために送信されたことを示すアラートが表示されることだけです。仕事が終わったら、何かをすることができます(たとえば、jsonを返すか、別のビューにリダイレクトします)。これが私のコードです:

サーバ側:

    public void DoWork()
    {
       var a = MakeADelay();
    }

    public async Task<ActionResult> MakeADelay()
    {
       await Task.Delay(5000);
       return  RedirectToAction("UploadComplete");
    }

    public ActionResult UploadComplete()
    {
       return View();
    }

これは私のクライアント側のコードです:

        $("#btnAsync").click(function () {
        $.ajax({
            url: '/Upload/DoWork',
            type: "post",
            success: function () {
                alert("Work in Progress!!");
            }
        });
    });

このコードを実行すると、すべてが期待どおりに実行されるように見えますが、サーバー側のコードがステートメントreturn RedirectToAction("UploadComplete");に到達すると、何もしません! 別のスレッドか何かで実行されていると思います。

何が問題ですか ?

2 番目の質問は、aync アクションの実際の意味は何ですか? ステートメントが完了するまでアクションを待機させたくありません。私は常にアクションがジョブを実行キューに送信し、クライアントに戻ることを望んでいます。ジョブが完了したら、何らかの方法でクライアントに通知できます。とにかくクライアントに通知するにはどうすればよいですか? SignalRか何かで?

4

1 に答える 1

1

何が問題ですか ?

それはここにあります:

public void DoWork()
{
   var a = MakeADelay();
}

これが行うことは、開始MakeADelayしてすぐに呼び出し元に戻り、おそらく応答の作成を完了して送信します。

遅延が完了した後、MakeADelayを呼び出して、 will の実行を継続しようとしますRedirectToAction。ただし、そのリクエストに対するレスポンスはすでに送信されているため、例外が発生する可能性が高くなります (awaitタスクを実行したことがないため無視されますa)。または、何もしないだけかもしれませんが、時間をさかのぼって、既に送信された応答を書き直すことは確かにありません。

2 番目の質問は、aync アクションの実際の意味は何ですか?

役立つと思われるテーマの紹介があります。また、私のブログでasyncは、HTTP プロトコルを変更しないことについても説明しています。それでも、すべての要求に対して 1 つの応答しか得られません。あなたがやろうとしているのは、1 つの要求に対して 2 つの応答を送信することですが、それはうまくいきません。

私は常にアクションがジョブを実行キューに送信し、クライアントに戻ることを望んでいます。ジョブが完了したら、何らかの方法でクライアントに通知できます。とにかくクライアントに通知するにはどうすればよいですか? SignalRか何かで?

次に、キューが必要になります。永続性が保証されたプロセス外のものをお勧めします。たとえば、Azure キュー、MSMQ、WebSphere MQ などです。

そして、はい、通知に SignalR を使用できます。私はそれをお勧めします。

于 2013-07-28T11:48:37.190 に答える