我正在開發一個在 .NET v4.6.1 上運行的舊 ASP.NET MVC 4 網站,我無法更改該網站,我正在使用 .NET 呼叫 Web api2 HttpClient。
如您所知,呼叫需要的是異步呼叫,但是在其他任何地方,代碼都沒有使用異步,我決定使用 refit 讓我的生活更輕松。
但是,我被迫在整個商店中執行以下操作:
myRefitHttpClient.GetSomestuff(whatever).GetAwaiter().GetResult();
如果您需要通過異步進行同步,是否有比上述阻塞代碼更好的方法?
非常感謝您的回復
uj5u.com熱心網友回復:
正如評論中提到的,異步同步在 ASP.NET 上的 .NET Framework 中總是很危險的。
為了避免死鎖,以下模式(如Stephen Cleary 文章的圖 6 中所述,允許您將異步請求從同步方法呼叫中分離出來:
public SomeStuff GetSomestuff(Whatever whatever)
{
return GetSomestuffAsync(whatever).GetAwaiter().GetResult();
}
public async Task<SomeStuff> GetSomestuffAsync(Whatever whatever)
{
// Do NOT queue a synchronization context continuation.
return myRefitHttpClient.GetSomestuff(whatever).ConfigureAwait(false);
}
然后,您可以通過單元測驗驗證您的代碼不會AsyncContext通過模擬同步背景關系與 Stephen Cleary 的庫發生死鎖。
[TestMethod]
public void Verify_DoesNotDeadlock()
{
AsyncContext.Run(() =>
{
var whatever = new Whatever();
var response = service.GetSomestuff(whatever);
Assert.IsNotNull(response);
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/503897.html
標籤:C# asp.net-mvc-4
