私のコントローラーでは、時間がかかる操作を行う必要があるため、各ステップの最後にビューを更新したいと考えています。私はMVCの初心者であり、コントローラーからビューを更新するたびに私が知っていることによると、次のようなことをしなければなりません
ViewBag.Result = "OK";
return View();
ただし、この場合、コントロールはビューに移動し、コントローラーは操作を続行できません。
助けてくれてありがとう!
私のコントローラーでは、時間がかかる操作を行う必要があるため、各ステップの最後にビューを更新したいと考えています。私はMVCの初心者であり、コントローラーからビューを更新するたびに私が知っていることによると、次のようなことをしなければなりません
ViewBag.Result = "OK";
return View();
ただし、この場合、コントロールはビューに移動し、コントローラーは操作を続行できません。
助けてくれてありがとう!
たとえば、TPL を使用して別のスレッドで長時間実行される操作を開始し、すぐにビューを返す必要があります。
public ActionResult StartLongRunningAction() {
Task.Factory.StartNew( () => {
// code your long running action here or call a method
});
return View();
}
クライアントに進行状況メッセージを送信するには、SignalRのようなフレームワークを使用することをお勧めします。
別のスレッドを使用してサーバー上で長時間実行される操作を実行し、サーバーに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();