2017-10-09 60 views
0

我的代碼是類似於...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:disableOperationContextAsyncFlowfalse),但這不會導致任何更改觀察到的行爲。

因此,短的要東西沿着

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

行我有什麼選擇?

回答

0

經過一番更多的實驗後,我發現了這個問題。該修復「簡單地」不使用.Result而是awaitThread.WhenAll,讓異步冒泡堆棧到服務,以便合同本身具有異步簽名。

我的工作假設是.Result「隱藏」了WCF的並行性,因此在.net 4.6.2中添加的異步上下文支持不會觸發。如果任何人有更多的見解,我會很樂意對此進行更正。