我正在閱讀這篇關于死鎖的文章,我嘗試使用自己的代碼,它沒有死鎖問題。為什么?我期待:GetJsonAsync完成等待并即將返回jsonStringMain正在執(zhí)行并保留上下文jsonTask.ResultGetJsonAsync想要返回,直到上下文可用jsonString死鎖將會發(fā)生 public static void Main(string[] args) { var jsonTask = GetJsonAsync(); int i = jsonTask.Result; Console.WriteLine(jsonTask.Result); } public static async Task<int> GetJsonAsync() { var jsonString = await ReturnIntAsync(); return jsonString; } public static async Task<int> ReturnIntAsync() { int i = 0; await Task.Run(() => i++); return i; }
1 回答

慕后森
TA貢獻1802條經(jīng)驗 獲得超5個贊
它不會死鎖,因為沒有同步,因此該方法在線程池線程(而不是主線程)上恢復執(zhí)行。SynchronizationContext
async
本文的相關引文(著重號為作者所加):
情況是這樣的:請記住,在我的介紹性帖子中,在您等待任務后,當方法繼續(xù)時,它將在上下文中繼續(xù)。
在第一種情況下,此上下文是 UI 上下文(適用于控制臺應用程序以外的任何 UI)。在第二種情況下,此上下文是 ASP.NET 請求上下文...
對于 UI 示例,“上下文”是 UI 上下文;對于 ASP.NET 示例,“上下文”是 ASP.NET 請求上下文。這種類型的死鎖可以對任何一個“上下文”造成。
如果你確實希望以這種方式使控制臺應用程序死鎖,則可以使用我的 AsyncEx
庫中在控制臺應用程序的主線程上安裝單線程上下文。AsyncContext
- 1 回答
- 0 關注
- 92 瀏覽
添加回答
舉報
0/150
提交
取消