C# 我可以在信号集线器中使用'ConfigureWait(false)`吗,或者信号器基础设施是否依赖于SynchronizationContext?
我有一些集线器方法,它们执行我想要异步调用的I/O操作 在我的集线器方法中使用C# 我可以在信号集线器中使用'ConfigureWait(false)`吗,或者信号器基础设施是否依赖于SynchronizationContext?,c#,signalr,signalr-hub,C#,Signalr,Signalr Hub,我有一些集线器方法,它们执行我想要异步调用的I/O操作 在我的集线器方法中使用ConfigureAwait(false)安全吗,或者signer是否需要捕获的同步上下文来获取请求信息或类似信息 public async Task<Response> Save() { // do some prep work var response = await SaveThingsAsync().ConfigureAwait(false);
ConfigureAwait(false)
安全吗,或者signer是否需要捕获的同步上下文来获取请求信息或类似信息
public async Task<Response> Save() {
// do some prep work
var response = await SaveThingsAsync().ConfigureAwait(false);
// do something with response
return response;
}
公共异步任务保存(){
//做一些准备工作
var response=await SaveThingsAsync().ConfigureAwait(false);
//做些有反应的事情
返回响应;
}
澄清一下:我的代码不需要线程区域性或存储在SynchronizationContext中的任何其他内容。我担心的是,signar服务器代码可能会在那里存储信息,如客户机id、请求信息等,如果异步方法从其他线程继续,它可能无法访问这些信息
当我测试我的方法时,它似乎工作得很好,但这不一定证明任何事情。ConfigureAwait没有删除同步上下文。它只会导致任务完成继续不使用当前同步上下文
如果当前异步方法的其余部分不依赖于同步上下文,那么使用它总是安全的。强调方法而不是线程。信号器不依赖于同步上下文。它通常在Win32服务(以及控制台应用程序,用于测试)中自托管,其中不存在
SynchronizationContext
另请参见。您能详细说明最后一段吗?在我的示例中,
Save
方法将在没有当前同步上下文的情况下继续。当它完成时,一些异步信号器方法将被通知并继续。即使Save
方法没有使用当前同步上下文,该方法是否可以恢复同步上下文(如果它依赖于它)?我的印象是,一旦调用ConfigureAwait(false)
,所有调用异步方法的操作都将在没有当前同步上下文的情况下执行。如果存在同步上下文,则不会删除同步上下文。相反,您应该切换到不存在同步上下文的线程池。您的任务在线程池上完成。等待该任务的任何人都不受该任务完成位置的影响。接受此答案,因为它专门针对Signal。