我的代码类似于...
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);
});我还有其他选择吗?
发布于 2017-10-10 00:35:19
经过更多的实验,我找到了问题所在。修复方法是“简单地”不使用.Result,而是使用await Thread.WhenAll,让异步冒泡到服务的堆栈,这样契约本身就有一个异步签名。
我的工作假设是,.Result“隐藏”了对WCF的并行性,因此.net 4.6.2中添加的异步上下文支持不会触发。如果任何人有更多的见解,我将非常乐意纠正这一点。
https://stackoverflow.com/questions/46644660
复制相似问题