[英]NLog MappedDiagnosticsLogicalContext not working in async/await with ConfigureAwait(false)
[英]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.Result
和Task.GetAwaiter().GetResult()
等同步等待沒有影響。
ConfigureAwait(false)
大致意思是“我不關心在這個異步等待之后代碼將在哪個線程上恢復”,所以如果原始線程(更准確地說SynchronizationContext
)被某些東西阻塞,它仍然會在不同的線程上繼續。 但是像GetAwaiter().GetResult()
這樣的同步等待永遠不會切換線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.