C# Task.WhenAll操作上下文为null

C# Task.WhenAll操作上下文为null,c#,wcf,C#,Wcf,我的代码类似于 var fetchers = [listOfDataFetchers] var results = Task.WhenAll(fetchers.Select(x => x.Fetch()).Result 由于获取程序基本上是在等待服务返回数据,因此这是任务和异步的完美用例 但是,获取程序需要OperationContext.Current,在本例中我无法直接注入它(是的,我确信这一点) 我已经尝试更新到.net 4.6.2,因为它假定修复了异步情况下的OperationC

我的代码类似于

var fetchers = [listOfDataFetchers]
var results = Task.WhenAll(fetchers.Select(x => x.Fetch()).Result
由于获取程序基本上是在等待服务返回数据,因此这是任务和异步的完美用例

但是,获取程序需要
OperationContext.Current
,在本例中我无法直接注入它(是的,我确信这一点)

我已经尝试更新到.net 4.6.2,因为它假定修复了异步情况下的OperationContext.Current(并在web.config中将
wcf:disableOperationContextAsyncFlow
设置为
false
),但这并没有导致观察到的行为发生任何变化

所以,除了沿着

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

我有什么选择吗?

经过更多的实验,我发现了这个问题。修复方法是“简单地”不使用
.Result
,而是
等待
线程。当所有
时,让async将堆栈冒泡到服务,以便契约本身具有异步签名


我的工作假设是,
.Result
“隐藏”与WCF的并行性,这样就不会触发.net 4.6.2中添加的异步上下文支持。如果有人有更多的见解,我将非常乐意对此进行更正。

也有同样的问题。发现只有设置
wcf:disableOperationContextAsyncFlow
有效。其他源(如此)使用的设置
Switch.System.ServiceModel.DisableOperationContextAsyncFlow
对我不起作用。