2013-01-03 32 views
2

我正在WF 4中創建一個工作流,其中有一個ParallelForeach活動,用於迭代項目集合。對於集合中的每個項目,我執行一個自定義的異步活動來並行處理多個項目。如何在WF 4中執行異步活動時控制線程數

上述解決方案適用於我,但是我擔心自從每個異步活動實例在其自己的線程上執行以來使用的線程數。有沒有一種方法來配置/控制在上述機制中執行parallelForeach活動時啓動的線程數量?

回答

2

因爲每個異步活動實例都在自己的線程上執行。誰說? Certainly not the docs.

ParallelForEach枚舉它的值併爲它列舉的每個值計劃Body。它只調度身體。身體如何執行取決於身體是否空閒。 如果Body沒有空閒,它將以相反順序執行,因爲計劃的活動將作爲堆棧處理,上次計劃的活動首先執行。

例如,如果在ParallelForEach中有{1,2,3,4}的集合,並使用WriteLine作爲主體來寫出值。你有4,3,2,1打印在控制檯。這是因爲WriteLine在4個WriteLine活動被調度之後不會空閒,所以它們使用堆棧行爲(先倒入)執行它們執行的

執行的並行性僅在活動創建書籤並空閒時發生。即便如此,兩個活動並不是同時執行 - 一個或多個活動剛剛停止執行,允許其他人按順序運行。可以理解的混亂,給定名稱,但就是這樣。

無論如何,當你依賴於框架來爲你並行時,不要擔心他們使用了多少個線程。他們可能已經掌握了一切。直到你知道他們沒有。

+0

謝謝!在嘗試執行之前,我確實閱讀了有關ParallelForEach的文檔。當我運行我的應用程序時,我注意到爲活動實例分配了不同的線程標識符(並且某些線程標識符因線程池出來而被重用)。 – user1946680

+0

@ user1946680:使用[SynchronizationContext](http://msdn.microsoft.com/en-us/library/system.activities.hosting.workflowinstance.synchronizationcontext.aspx)運行工作流程來控制它們的線程。 SC有執行代碼的Send(同步)和Post(異步)方法。如果你願意,你總是可以創建自己的實現並管理任何調用Post來限制你的線程。我不會建議,因爲框架的線程代碼寫得很好。它就像擔心內存管理一樣 - 不要,除非你絕對必須。他們做得更好。 – Will

+1

太棒了!這很好知道。現在,我會保持原樣並依賴框架。 – user1946680

0

意思是否正確,ParallelForEach不需要每個分支都有一個新的線程。如果您正在阻止應在AsyncCodeActivity中發生的代碼中的I/O,以免發生不必要的阻塞。如果你想CPU綁定的工作與其他活動並行運行,你需要將它包裝在AsyncCodeActivity中,或者使用InvokeMethod {RunAsynchronously = true},在這種情況下,框架將負責在後臺線程上運行工作。

SynchronizationContext擴展點適用於您需要WF集成的特定現有線程模型的情況。其主要例子包括ASP.NET的線程環境,以及Windows Presentation Foundation/WinForms(例如,如果你想讓一個活動正常工作)。

相關問題