2017-10-09 4 views
0

私のコードは、に似ている...Task.WhenAllのOperationContextヌル

var fetchers = [listOfDataFetchers] 
var results = Task.WhenAll(fetchers.Select(x => x.Fetch()).Result 

フェッチャは基本的にデータを返すサービスを待っているように、これはタスクと非同期のための完璧なユースケースです。

しかし、フェッチャにはOperationContext.Currentが必要です。この場合は直接挿入できません(はい、私はそれについて確信しています)。

私はすでに、非同期のケースでOperationContext.Currentを固定していると思われたので、.net 4.6.2に更新しようとしましたが(web.configのwcf:disableOperationContextAsyncFlowからfalseに設定しました)観察された行動。だから、

var oc = OperationContext.Current; 
Parallel.ForEach(entries, entry => 
{ 
    OperationContext.Current = oc; 
    Execute(entry); 
}); 

の線に沿って何かに行くの短いが、私は任意のオプションを持っていますか?

答えて

0

もう少し実験をした後、私は問題を理解しました。この修正は、.Resultではなく、awaitThread.WhenAllを使用せずに、非同期でサービスにスタックして、契約自体に非同期の署名が付くようにしました。

.ResultがWCFとの並列性を「隠す」ため、.net 4.6.2で追加された非同期コンテキストサポートがトリガーしないようになっています。誰かがより多くの洞察力を持っているなら、私はそれを訂正することができれば幸いです。