簡體   English   中英

如果使用 ConfigureAwait(false),async/await 是否仍會死鎖?

[英]Can async/await still deadlock if ConfigureAwait(false) is used?

根據此鏈接,在特定情況下 async/await 可能會發生死鎖。

但是,如果我總是使用ConfigureAwait(false)仍然會發生死鎖嗎?

例如: task.ConfigureAwait(false).GetAwaiter().GetResult()

而不是: task.GetAwaiter().GetResult()

如果將要完成的task或任何進一步的嵌套操作捕獲了您當前的上下文,如果該上下文與特定線程相關聯,它仍然可能死鎖 - 因為您正在使用該線程調用GetResult並阻塞,使其無法用於其他人仍然使用。

只需使用await 它是await可以釋放您當前的上下文。

是的,它仍然會死鎖,必須在所有嵌套的等待中實現ConfigureAwait(false) ,其中一些您可能無法控制。

最好的方法是不要依賴它,只是不要混合使用同步和async調用,讓Async/Await傳播。

確保它不會死鎖(沒有await )的唯一可靠方法(並且有爭議)是將其卸載/包裝到另一個任務並Wait它,或者在沒有SynchronizationContext的框架中

顧名思義, ConfigureAwait()只影響異步await 它對Task.Wait()Task.ResultTask.GetAwaiter().GetResult()等同步等待沒有影響。

ConfigureAwait(false)大致意思是“我不關心在這個異步等待之后代碼​​將在哪個線程上恢復”,所以如果原始線程(更准確地說SynchronizationContext )被某些東西阻塞,它仍然會在不同的線程上繼續。 但是像GetAwaiter().GetResult()這樣的同步等待永遠不會切換線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM