线程池线程需要 ConfigureAwait(false) 吗?
ConfigureAwait(false) needed with threadpool threads?
假设我不关心同步上下文,当我已经在 ThreadPool
线程中时,等待调用是否需要 .ConfigureAwait(false)
?例如,我通过以下方式开始我的异步操作:
await Task.Run(() => myService.DoSomething());
我知道如果你不关心上下文并且你在 UI 线程或 ASP.NET 请求中,我知道它很重要,只是想知道它是否提供相同的好处这些情况之外的异步操作。
如果存在当前同步上下文(即使线程 运行 代码是线程池线程),它也会被使用。如果您不想使用该同步上下文,则需要使用 ConfigureAwait(false)
。如果没有当前同步上下文,那么 ConfigureAwait(false)
不会做任何事情,因为没有要捕获的同步上下文,并且您是否拥有它是无关紧要的。如果您希望捕获同步上下文(无论当前线程是否是线程池线程),那么您将不希望调用 ConfigureAwait
.
简而言之,您是否 运行 作为线程池线程与是否应捕获同步上下文的决定无关。
假设我不关心同步上下文,当我已经在 ThreadPool
线程中时,等待调用是否需要 .ConfigureAwait(false)
?例如,我通过以下方式开始我的异步操作:
await Task.Run(() => myService.DoSomething());
我知道如果你不关心上下文并且你在 UI 线程或 ASP.NET 请求中,我知道它很重要,只是想知道它是否提供相同的好处这些情况之外的异步操作。
如果存在当前同步上下文(即使线程 运行 代码是线程池线程),它也会被使用。如果您不想使用该同步上下文,则需要使用 ConfigureAwait(false)
。如果没有当前同步上下文,那么 ConfigureAwait(false)
不会做任何事情,因为没有要捕获的同步上下文,并且您是否拥有它是无关紧要的。如果您希望捕获同步上下文(无论当前线程是否是线程池线程),那么您将不希望调用 ConfigureAwait
.
简而言之,您是否 运行 作为线程池线程与是否应捕获同步上下文的决定无关。