例如,假設我有以下代碼:
public static class MyClass
{
private static async Task<int> GetZeroAsync()
{
return await Task.FromResult(0);
}
public static int GetZero()
{
return GetZeroAsync().Result;
}
}
在GetZero()中,我直接從.Result回傳的 Task 的屬性中讀取GetZeroAsync()。直接從.Result屬性中讀取是否安全,因為回傳的任務已經完成(即它會導致任何死鎖、執行緒重復或背景關系同步問題)?
我問的原因是因為在閱讀了如何從 C# 中的同步方法呼叫異步方法的所有答案之后?以及 Stephen Cleary 的文章https://msdn.microsoft.com/en-us/magazine/mt238404.aspx,讓我急于使用.Result.
uj5u.com熱心網友回復:
是的,Result完成任務是安全的。但是,如果您的程式的正確性依賴于正在完成的任務,那么您的代碼庫就很脆弱。至少您應該在除錯期間驗證此斷言:
public static int GetZero()
{
var task = GetZeroAsync();
Debug.Assert(task.IsCompleted);
return task.Result;
}
您可以考慮改為添加運行時檢查。崩潰的程式可以說比死鎖的程式更好。
public static int GetZero()
{
var task = GetZeroAsync();
if (!task.IsCompleted)
throw new InvalidOperationException("The task is not completed.");
return task.Result;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480679.html
上一篇:為什么Main不等待所有執行緒在異步程式中進行評估?
下一篇:顫振異步等待未按順序運行
