Task.WhenAll OperationContext null

时间:2017-10-09 10:50:22

标签: c# wcf

我的代码类似于......

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);
});

我有任何选择吗?

1 个答案:

答案 0 :(得分:1)

经过一些实验,我发现了问题。修复是"简单"不使用.Resultawait使用Thread.WhenAll,让异步将堆栈冒泡到服务中,以便合同本身具有异步签名。

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