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
对我不起作用。