1

我有一個非常成熟的n層ASP.NET MVC應用程序,它目前可以同步執行所有操作;所有控制器都繼承自Controller而不是AsyncController。從ASP.NET MVC應用程序異步調用WCF

我想要做的是採取一個較低的層(即每一個流消耗),並把一個等待呼叫到WCF。爲什麼等待?那麼,我認爲它會減少總線程數並使服務器更具可擴展性。

但是,我不能更改此層以外的任何代碼。所以通常情況下,人們會將調用方法從返回T更改爲「異步任務」,並將方法名稱設置爲「異步」後綴,例如

public string GetData() 

public Task<string> GetDataAsync() 

好了,讓我去一下以下的(減少)代碼:

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); 
    } 
} 

當我ru在這個代碼(F5)中,它到達了它所稱的「await client.DoSomething(request).ConfigureAwait(true);」的行。然後,不幸的是,這是我看到的最後一條線索。偶爾它會在我調試時返回(F11),但99%的時間不會。

  • 非ASYNC方法工作完全正常

  • 調試WCF服務表示它接收到的請求,處理它,並返回

  • 使用控制檯應用程序,這完美地工作。只有當我在我的Web應用程序的某個「中間」層嘗試此操作時,線程纔會消失。

  • 我試過用.ConfigureAwait(true)和.ConfigureAwait(false)。

回答

1

簡短的回答:不要在異步代碼塊(你的問題是,其阻斷.Result,而其Task是併發的,而不是平行的)

朗答案(真的好讀書, ):Don't Block on Async Code