0

私のコントローラーでは、時間がかかる操作を行う必要があるため、各ステップの最後にビューを更新したいと考えています。私はMVCの初心者であり、コントローラーからビューを更新するたびに私が知っていることによると、次のようなことをしなければなりません

ViewBag.Result = "OK";
return View();

ただし、この場合、コントロールはビューに移動し、コントローラーは操作を続行できません。

助けてくれてありがとう!

4

3 に答える 3

1

たとえば、TPL を使用して別のスレッドで長時間実行される操作を開始し、すぐにビューを返す必要があります。

public ActionResult StartLongRunningAction() {
    Task.Factory.StartNew( () => {

        // code your long running action here or call a method
    });
    return View();
}

クライアントに進行状況メッセージを送信するには、SignalRのようなフレームワークを使用することをお勧めします。

于 2013-07-12T10:49:21.253 に答える
0

別のスレッドを使用してサーバー上で長時間実行される操作を実行し、サーバーにAjaxリクエストを送信して、N 秒ごとに操作ステータスを取得します。

WebSockets/SignalR についても考えることができます。ただし、すべてのブラウザーがこのテクノロジーをサポートしているわけではありません。NuGet には、SignalR 実装用のライブラリがいくつかあります。http://nuget.org/packages?q=signalr

このビデオをチェックすることをお勧めしますhttp://www.asp.net/signalr/videos/getting-started/signalr-and-web-sockets

より高速なソリューションが必要な場合は、次のようにビューを更新できます。

<p>@Model.OperationState</p>

@if (Model.OperationIsInProgress){
<script>
   setTimeout("location.reload(true);", 10000);
<script>
}

しかし、それは非同期アプローチではありません。この js は 10 秒ごとにページをリロードします。

新しいスレッドを開始するには、単純な System.Threading クラスを使用できます。

using System.Threading;

var thread = new Thread(() => {
    //Call your long running operation here
});
thread.Start();
于 2013-07-12T10:39:06.793 に答える