我可以在 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.

另见 this SignalR issue