我可以在SignalR集线器中使用`ConfigureAwait(false)`,还是SignalR基础设施依赖于SynchronizationContext?

时间:2016-03-24 10:02:08

标签: c# signalr signalr-hub

我有一些执行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,请求信息等,如果从不同的线程继续执行异步方法,它可能无法访问。

当我测试我的方法时,它看起来工作得很好,但这并不能证明任何东西。

2 个答案:

答案 0 :(得分:5)

ConfigureAwait不会删除同步上下文。它只会导致任务完成继续不使用当前的同步上下文。

如果当前异步方法的其余部分不依赖于同步上下文,则始终可以安全使用。强调方法而不是线程

答案 1 :(得分:4)

SignalR不依赖于SynchronizationContext。它通常是在Win32服务(以及用于测试的控制台应用程序)中自托管的,其中没有SynchronizationContext

另见this SignalR issue