1

現在、すべてを同期して実行する非常に確立された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)を試しました。

答えて

1

短い答え:

長い答え(と本当に良い読書(そのTask同時1、ないパラレル一つでありながら、あなたの問題は、.Resultブロックです)非同期コードをブロックしていません、あまりにも):Don't Block on Async Code

関連する問題