WCF サービスに接続する ASP.NET MVC 3 サイトがあります。WCF サービスはサイトから独立しており、Windows サービスでホストされています。ほとんどの呼び出しは同期的であるため、WCF がそれを実行するのを待つことは問題ではありません。
ただし、これらの (既に実装されている) 呼び出しの 1 つは少し時間がかかりすぎます。また、基本的に直接何も出力しないため、サービスでスピンして忘れたいと思いました。
だから私は自分のコードを次のように変更しました:
public ViewResult StartSlowCalculation(CalculationOptions calculationOptions)
{
WcfServiceProxy.DoSlowCalculation(calculationOptions);
ViewBag.Started = true;
return View();
}
に
public ViewResult StartSlowCalculation(CalculationOptions calculationOptions)
{
Task.Run(() =>
{
WcfServiceProxy.DoSlowCalculation(calculationOptions);
});
ViewBag.Started = true;
return View();
}
私が理解しているように、これは非同期リクエストを開始し、すぐに戻る必要があります。それでも、実行は完全に同期的であり、UI は操作が完了するまで凍結されます。
私が見逃している明らかなことは何ですか?
アップデート:
また、呼び出しサイトでサービスへの呼び出しを同期解除するためだけに、サーバーの実装を非同期のものに変更したくないことに注意してください。
StartSlowCalculation
さらに、メソッドの実行が終了しても、サーバーはサービス メソッドの実行が終了するまで応答を返さないことに気付きました。
WCF サービス プロキシは次のことを行います。
public void DoSlowCalculation(CalculationOptions calculationOptions)
{
//some logging code
Channel.DoSlowCalculation(calculationOptions);
}
したがって、完全に同期していますが、独立したスレッドで実行する必要があるため、問題にはなりません。