2012-09-18 71 views
0

我是新來的C#任務,由C++來,想問問這是使用任務並行庫的正確途徑。計劃從短期螺紋

我有哪些隊列長時間運行操作的Web服務。我不想使用異步Web調用,所以我的想法是使用TPL,在調用Web操作時創建任務。我想知道是否有任何種類的資源泄漏,如果我從網絡操作完成後立即死亡的線程安排任務。假設我不會提及任務,因爲我不需要檢查它的狀態和結果。謝謝。

編輯: 斯里,沒有表達清楚自己的第一槍。我的問題涉及到Web服務,而不是客戶端。客戶端調用需要很長時間的Web服務操作。 Web服務調用返回說操作已成功排隊/在後臺執行。在Web服務操作中,我想使用TPL並且不存儲由StartNew返回的任務對象。想知道,如果我沒有閱讀它的狀態並因此泄漏,任務對象是否永久保存。也許這只是我的C++思想妨礙了我,因爲它是託管代碼,所以我不應該關心泄漏。

+0

我會問,爲什麼你不希望同時從任務想了解資源泄漏使用異步調用網頁你創建網絡電話。也許我誤解了這個問題;但它聽起來像你想從另一個線程創建一個任務來執行一些Web通話。如果資源泄漏是一個問題,並且這是您想要做的事情,那麼當您擁有很好的異步IO功能時,爲什麼會「泄漏」一個只等待高度潛在IO的線程呢? –

+0

這聽起來像你想排隊操作並在後臺執行它們(大概是通過雙向WCF服務或some.pilling機制)。我不認爲TPL適合整個場景。一個是你可能想要一個可靠的隊列,這意味着一定程度的持久性。我會建議一些現成的隊列。如果你這樣做,那麼隊列將處理線程執行的操作,以及負載均衡等 –

+0

但是,如果使用TPL,排隊和執行是相當大的隱患這是我的理解TPL的要點之一。無論如何它都使用ThreadPool。該操作只是在數據庫中更新完成時的狀態,因此我認爲不需要使用雙工WCF通信。在我的情況下,不需要持久隊列,因爲可以在Web服務啓動期間使用TPL啓動操作,並從數據庫建立狀態時啓動操作。我只是擔心,如果開始一項任務,忘記一個任務對象並退出一個線程,在任務完成之前啓動任務導致任何TFL欺騙 –

回答

0

忘掉任務不會造成任何TPL問題看stackoverflow.com/questions/3734280/...瞭解更多詳情。但是,在這項任務中你想做的工作很重要 - 如果你「忘掉它」,你怎麼知道它已經完成,正確完成,並且不需要重新開始?這都是特定於應用程序的。

「完全忙」線程池意味着1023級線程池中的線程已創建並正在執行(這可能會很糟糕)。否則,線程池最初以每個CPU/Core一個線程爲最小值,並且只要沒有非運行線程數,就通過每秒啓動一個新線程來保持最小值。所以,它確實不會「排隊」任何東西。例如你可以開始12個任務,並在一點上「排隊」 4,在另一點它跑了所有12 ...