Task.WhenAll的OperationContext空

问题描述:

我的代码是类似于...Task.WhenAll的OperationContext空

var fetchers = [listOfDataFetchers] 
var results = Task.WhenAll(fetchers.Select(x => x.Fetch()).Result 

作为提取器基本上是等待服务恢复数据,这是一个完美的用例任务和异步。

然而,fetchers需要OperationContext.Current,我不能直接在这种情况下注入(是的,我相信这一点)。

我已经尝试更新到.net 4.6.2,因为它应该修复异步情况下的OperationContext.Current(并且在web.config中设置wcf:disableOperationContextAsyncFlowfalse),但这不会导致任何更改观察到的行为。

因此,短的要东西沿着

var oc = OperationContext.Current; 
Parallel.ForEach(entries, entry => 
{ 
    OperationContext.Current = oc; 
    Execute(entry); 
}); 

行我有什么选择?

经过一番更多的实验后,我发现了这个问题。该修复“简单地”不使用.Result而是awaitThread.WhenAll,让异步冒泡堆栈到服务,以便合同本身具有异步签名。

我的工作假设是.Result“隐藏”了WCF的并行性,因此在.net 4.6.2中添加的异步上下文支持不会触发。如果任何人有更多的见解,我会很乐意对此进行更正。