現在、すべてを同期して実行する非常に確立されたn層のASP.NET MVCアプリケーションがあります。すべてのコントローラはAsyncControllerではなくControllerから継承します。ASP.NET MVCアプリケーションから非同期にWCFを呼び出す
私がしたいのは、下位層(文字通りすべてのフローが消費する)の1つをとり、待っているWCFを呼び出すことです。なぜ待っていますか?さて、私は全体のスレッド数を減らし、サーバーのスケーラビリティを向上させると考えています。
しかし、私はこの層の外にあるコードを変更する立場にはありません。だから通常は、呼び出しメソッドがTを返すように変更して 'async Task'を返し、メソッド名に "async"接尾辞、を付けます。:
public ResponseObject GetSomething(RequestObject request)
{
return MyMethodAsync(request).Result;
}
private static async Task<ResponseObject> MyMethodAsync(RequestObject request)
{
using (var client = new Client(new NetTcpBinding(), new EndpointAddress(Url))))
{
await client.DoSomething(request).ConfigureAwait(true);
}
}
:
public string GetData()
public Task<string> GetDataAsync()
オーケーからから、私は、次の(削減)コードとそれについて行きました私はルこのコード(F5)では、「await client.DoSomething(request).ConfigureAwait(true);」という行に移動します。残念ながら、それは私のスレッドの最後のものです。時々、私がデバッグしているとき(F11)は戻ってきますが、99%は戻っていません。
非ASYNC方法は、WCFサービスのデバッグ完全に罰金
に動作しますが、それは要求を受け取る示し、それを処理し、これは完璧に動作し、コンソールアプリケーションを使用して
を返します。スレッドを消す私のウェブアプリケーションの「中間」層の1つでこれを試すときだけです。
私は、.ConfigureAwait(true)と.ConfigureAwait(false)を試しました。