2012-02-27 49 views
13

我有一個使用任務並行庫實現的長時間運行的任務。當任務開始時,我抓取幾個輸入值和集合的快照,然後使用該信息執行各種操作。如果任何這些值或集合在任務運行時發生更改,我希望在完成後立即再次運行該任務。我應該創建一個新的任務還是有重用現有任務的方法?開始第二次迭代的最佳方式是什麼?如何重新啓動/重複使用重複性任務?

回答

11

創建一個新任務。

由於http://msdn.microsoft.com/en-us/library/dd270682.aspx指出,試圖重新啓動正在運行或已完成的任務不受支持。執行通常會引發異常的事情通常不是一個好主意,重新使用任務就是其中之一。

+0

你會如何表示需要完成第二項任務?在原始任務運行之前可能會發生更改,直到完成後的某個時間。 – SonOfPirate 2012-02-28 02:28:45

+0

基於這個標準,我認爲你會做一個單一的,不終止任務輪詢當前狀態,如果狀態改變,做你的事情。這裏的基本要求是,這是異步發生的,以避免阻塞主線程。您需要放置某種標誌來向Task表明應用程序正在關閉,並且應該終止。 – 2012-02-28 12:14:03

+0

一個單一的,不終止的任務是我在想什麼。我可以使用CancellationToken來處理應用程序何時關閉,但我不確定我應該使用哪種機制來標記我需要任務來執行我的算法。如果我使用AutoResetEvent,那麼我將無法取消該任務的線程將被暫停等待事件。另一方面,我讀到使用SpinWait是非常密集的CPU。 – SonOfPirate 2012-02-28 12:54:54

1

您不能再次啓動現有的Task。所以你有兩種選擇:

  1. 開始一個新的Task。這可能更乾淨。
  2. Task中運行循環,檢查自上次以來是否發生了變化,如果有變化,則開始新的迭代。
+0

與上面相同的問題:您如何表示需要第二項任務? – SonOfPirate 2012-02-28 02:29:17

+0

很難說不知道你如何確定第二項任務是需要的。如果您想要在完成後重新啓動,則可以使用事件。 – svick 2012-02-28 02:37:27

0

您還可以重構程序邏輯以使用函數指針(或VB.NET中的委託)。