我可以在 SignalR 集线器中使用“ConfigureAwait(false)”吗,或者 SignalR 基础结构是否依赖于 SynchronizationContext?
Can I use `ConfigureAwait(false)` in SignalR hubs, or does SignalR infrastructure rely on SynchronizationContext?
我有一些执行 I/O 操作的集线器方法,我想异步调用这些方法。
在我的集线器方法中使用 ConfigureAwait(false)
是否安全,或者 SignalR 是否需要捕获的 SynchronizationContext 来获取请求信息或类似信息?
public async Task<Response> Save() {
// do some prep work
var response = await SaveThingsAsync().ConfigureAwait(false);
// do something with response
return response;
}
澄清一下:我的代码不需要线程文化或 SynchronizationContext 中存储的任何其他内容。
我担心的是 SignalR 服务器代码可能会在那里存储信息,例如客户端 ID、请求信息等,如果从不同的线程继续异步方法,它可能无法访问这些信息。
当我测试我的方法时,它似乎工作正常,但这并不能证明任何事情。
ConfigureAwait 不删除同步上下文。它只会导致任务完成继续不使用当前同步上下文。
如果当前异步方法的其余部分不依赖于同步上下文,则始终可以安全使用。强调 method 而不是 thread.
SignalR 不依赖于 SynchronizationContext
。它通常在 Win32 服务(和控制台应用程序,用于测试)中自托管,其中没有 SynchronizationContext
.
我有一些执行 I/O 操作的集线器方法,我想异步调用这些方法。
在我的集线器方法中使用 ConfigureAwait(false)
是否安全,或者 SignalR 是否需要捕获的 SynchronizationContext 来获取请求信息或类似信息?
public async Task<Response> Save() {
// do some prep work
var response = await SaveThingsAsync().ConfigureAwait(false);
// do something with response
return response;
}
澄清一下:我的代码不需要线程文化或 SynchronizationContext 中存储的任何其他内容。
我担心的是 SignalR 服务器代码可能会在那里存储信息,例如客户端 ID、请求信息等,如果从不同的线程继续异步方法,它可能无法访问这些信息。
当我测试我的方法时,它似乎工作正常,但这并不能证明任何事情。
ConfigureAwait 不删除同步上下文。它只会导致任务完成继续不使用当前同步上下文。
如果当前异步方法的其余部分不依赖于同步上下文,则始终可以安全使用。强调 method 而不是 thread.
SignalR 不依赖于 SynchronizationContext
。它通常在 Win32 服务(和控制台应用程序,用于测试)中自托管,其中没有 SynchronizationContext
.