我們在深度抽象程序集中的某個地方存在從OperationContext.Current中讀取數據的WCF行爲,當此代碼從Task中執行時,OperationContext.Current爲空,是否可以在抽象程序集內部解決這個問題,還是需要向這個程序集的所有消費者添加一些代碼?在任務並行庫中保留OperationContext
回答
似乎是唯一的辦法就是添加一些的CallContext中,就像目前的主要存儲...
點在哪裏您創建Task
instance,你應該使用一個封閉,像這樣:
// The operation context.
OperationContext oc = OperationContext.Current;
Task t = Task.Factory.StartNew(() => {
// Do something with context here, it will be valid for
// the life of the operation.
};
您也可以撥打overload of StartNew
這需要一個state
參數並通過OperationContext
instance中,鑄造和使用它需要在Task
的時候,像這樣:
Task t = Task.Factory.StartNew(s => {
// s is an object, so need to cast here.
var oc = (OperationContext) c;
// Work with the OperationContext.
},
// Note, this is passed to the delegate through the 's' parameter.
OperationContext.Current);
注意,在這兩種情況下,OperationContext
只會有利於操作的使用壽命。該操作的完成應取決於Task
的完成情況。
如果你推出一個Task
將運行在操作完成後,那麼你應該從你的OperationContext
需要的值那些複製到另一個結構的方式傳遞到Task
進行處理。
是的,我知道,但問題是不能強制消費者代碼不只是啓動一個任務,並做的東西:) – 2012-07-17 07:14:21
@TimMahy然後,你似乎必須在抽象中構建上下文,並將其傳遞到需要的地方。 – casperOne 2012-07-17 11:49:45
正面臨着類似的問題。通過任務調用服務。 下面的代碼片斷解決了。 OperationContext.Current
明確地通過在服務調用完成之前投射由Task
提供的state
變量來設置。
Task<int> taskContactsCount = Task.Factory.StartNew<int>((state) =>
{
int count = 0;
try
{
OperationContext.Current = (OperationContext)state;
TestServiceClient testServiceProxy = new TestServiceClient();
var count = testServiceProxy.GetCount();
}
catch (Exception ex)
{
}
return contactsCount;
}, OperationContext.Current);
- 1. 在任務中保留內存離散
- 2. 並行任務庫WaitAny Design
- 3. Quartz.net +任務並行庫
- 4. .NET任務並行庫
- 5. 任務並行庫ArgumentException
- 6. 任務並行庫 - 單核並行度
- 7. 任務並行庫和多個並行任務
- 8. 在任務並行庫:如何推遲Task.TaskFactory.FromAsync任務執行?
- 9. 任何方式來保證所有任務將嘗試與任務並行庫?
- 10. 使用事務與任務並行庫
- 11. 任務並行庫中的任務如何影響ActivityID?
- 12. Ant任務只保留JAR中的某些類,並進行依賴性檢查?
- 13. 保證並行線程/任務/任務的立即啓動
- 14. 在Jenkins中運行並行任務
- 15. 如何使用Ant tar任務並保留文件權限?
- 16. AlertDialog響應的保留任務
- 17. 任務並行庫拋出NullReferenceException與IEnumerable
- 18. .net 4.0任務並行庫與MPI.NET
- 19. 奇怪的任務並行庫InvalidOperationException
- 20. 任務單聲道並行庫實現?
- 21. 微軟的CCR vs任務並行庫
- 22. 任務並行庫文件句柄
- 23. 不同的使用任務並行庫
- 24. 查詢任務並行庫實現
- 25. 使用任務並行庫的事件
- 26. ThreadLocal的聚合和任務並行庫
- 27. 如何使用任務並行庫
- 28. 任務並行庫 - 阻止操作?
- 29. 任務並行庫使用幫助
- 30. 任務並行庫和異常
誰開始「任務」?消費者?在啓動「Task」之前是否執行了抽象程序集的任何代碼? – svick 2012-07-16 08:46:40
不,這是問題,消費者開始的任務:( – 2012-07-16 09:07:08