我的代码类似于......
var fetchers = [listOfDataFetchers]
var results = Task.WhenAll(fetchers.Select(x => x.Fetch()).Result
由于fetcher基本上是在等待服务返回数据,因此这是任务和异步的完美用例。
然而,取材者需要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);
});
我有任何选择吗?
答案 0 :(得分:1)
经过一些实验,我发现了问题。修复是"简单"不使用.Result
而await
使用Thread.WhenAll
,让异步将堆栈冒泡到服务中,以便合同本身具有异步签名。
我的工作假设是.Result
"隐藏" WCF的并行性,因此.net 4.6.2中添加的异步上下文支持不会触发。如果有人有更多的见解,我会非常乐意对此进行更正。