C# 如果使用ConfigureAwait(false),异步/等待是否仍然会死锁?

C# 如果使用ConfigureAwait(false),异步/等待是否仍然会死锁?,c#,async-await,deadlock,C#,Async Await,Deadlock,据了解,在特定情况下,异步/等待可能会发生死锁 但是,如果我总是使用ConfigureAwait(false),死锁还会发生吗 例如:task.ConfigureAwait(false).GetAwaiter().GetResult() 除了:task.GetAwaiter().GetResult()是,它仍然可能会死锁,ConfigureAwait(false)必须在所有嵌套的等待中实现,其中一些您可能无法控制 最好的方法不是依赖它,只是不要混合使用同步和async调用,让async/Awai

据了解,在特定情况下,异步/等待可能会发生死锁

但是,如果我总是使用
ConfigureAwait(false)
,死锁还会发生吗

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


除了:
task.GetAwaiter().GetResult()

是,它仍然可能会死锁,
ConfigureAwait(false)
必须在所有嵌套的等待中实现,其中一些您可能无法控制

最好的方法不是依赖它,只是不要混合使用同步和
async
调用,让async/Await传播


确保它不会死锁(没有
Wait
)的唯一可靠方法(也是有争议的)是将它卸载/打包到另一个任务,然后
Wait
,或者在没有SynchronizationContext的框架中,如果将要完成的任务或任何进一步的嵌套操作捕获了当前上下文的内容,如果该上下文绑定到特定线程,则仍然会死锁,因为您正在使用该线程调用
GetResult
,并进行阻塞,使其不可供其他人使用


只需使用
等待
。可以释放当前上下文的是
await

顾名思义,
ConfigureAwait()
只影响异步
await
。它对同步等待没有影响,例如
Task.Wait()
Task.Result
Task.GetAwaiter().GetResult()

ConfigureAwait(false)
的大致意思是“我不在乎异步等待后的代码将在哪个线程上继续”,因此,如果原始线程(更准确地说是
SynchronizationContext
)被某个线程阻塞,它仍将在另一个线程上继续。但是像
GetAwaiter().GetResult()这样的同步等待永远不会切换线程。

旁注:它是“配置等待”,而不是“配置任务”。
task.ConfigureAwait(false).GetAwaiter().GetResult()
中的
ConfigureAwait(false)
没有任何影响,因为没有要配置的
await