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:disableOperationContextAsyncFlow
到false
),但这不会导致任何更改观察到的行为。
因此,短的要东西沿着
var oc = OperationContext.Current;
Parallel.ForEach(entries, entry =>
{
OperationContext.Current = oc;
Execute(entry);
});
行我有什么选择?
答
经过一番更多的实验后,我发现了这个问题。该修复“简单地”不使用.Result
而是await
Thread.WhenAll
,让异步冒泡堆栈到服务,以便合同本身具有异步签名。
我的工作假设是.Result
“隐藏”了WCF的并行性,因此在.net 4.6.2中添加的异步上下文支持不会触发。如果任何人有更多的见解,我会很乐意对此进行更正。