我有一個非常成熟的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)。