多くの日がこれに働いた後、私は実行可能な解決策を持っている:
は、ここで(単純な名前で)それをやっての私の非常にナイーブ試みです。それはきれいではないかもしれませんが、それはうまくいくかもしれませんし、他の人にとって役に立つアイデアかもしれないので、ここでそれがあります:
私はこの問題を解決する方法を説明します:より長いプロセスがバックグラウンドで実行され、終了時にイベントが発生します。このイベントが受信されると、ユーザーを(自動的に)最終ページにリダイレクトする必要があります。
まず、イベントを聴くためのクラスを作成しました。私はコントローラでこれを直接実行しようとしましたが、署名と署名の解除に注意する必要があります。なぜなら、コントローラは要求ごとに作成され破棄されるためです。この "リスナークラス"には、イベントが受信されたときに "true"に設定されたboolプロパティがあります。
最初のアクションがトリガされると、コントローラは、通常、私は新しいアクションへのリダイレクトこの単純なJavaスクリプトを持っている「待機」ページにリダイレクトします。これは、(運動に長いプロセスを設定します
<script type="text/javascript">
window.location = "@Url.Action("WaitThenRedirect", "AuxiliaryControllerName")";
</script>
別のイベントを通じて)。キーは、非同期アクションでこれを行うことです(このコントローラーはAsyncControllerから継承します)。私は他のソリューションのためのAjax構文を使用することが可能であると考えてい
public static event EventHandler<AuxiliaryEventsArgs> ProcessReady;
public void WaitThenRedirectAsync()
{
AsyncManager.OutstandingOperations.Increment();
ProcessReady += (sender, e) =>
{
AsyncManager.Parameters["success"] = e.success;
AsyncManager.OutstandingOperations.Decrement();
};
WaitForEvent();
}
public ActionResult WaitThenRedirectCompleted(bool success)
{
if (success)
{
return RedirectToAction("RedirectToView", "ControllerName");
}
else
{
return RedirectToAction("UnexpectedError", "ControllerName");
}
}
private void WaitForEvent()
{
bool isWaitSuccessful = true;
int waitingLoops = 0;
int waitingThreshold = 200;
int sleepPeriod = 100; // (milliseconds)
while (!EventsListener.IsTheThingReady())
{
System.Threading.Thread.Sleep(sleepPeriod);
++waitingLoops;
if (waitingLoops > waitingThreshold)
{
System.Diagnostics.Debug.WriteLine("Waiting timed out!");
isWaitSuccessful = false;
break;
}
}
isWaitSuccessful = true;
if (null != ProcessReady)
{
AuxiliaryEventsArgs arguments = new AuxiliaryEventsArgs();
arguments.success = isWaitSuccessful;
try
{
ProcessReady(null, arguments);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Error in event ProcessReady" + ex);
}
}
}
を、これは次のようになります。これは、これがどのように見えるかである(more info hereを)(。。これは離れて、すべての非同期のものを維持することです、私は補助コントローラを使用します)私が持っているものはうまく動作します。私はこれが非常に一般的な必要ではないと信じていますが、うまくいけば誰かが恩恵を受けるだろ
同期を実装する必要があります。 –
ありがとう、私はそれを調べようとします! – Pablo