2012-08-15 50 views
0

在我的申請,我一堆操作添加到列表(任務)象下面這樣:.NET任務:我如何創建可以全部同步或異步執行的任務集合?

Dim Tasks As New List(Of Task) 

Tasks.Add(Task.Factory.StartNew(Sub() 
            System.Threading.Thread.Sleep(3000) 
           End Sub)) 

Tasks.Add(Task.Factory.StartNew(Sub() 
            System.Threading.Thread.Sleep(3000) 
           End Sub)) 

Task.WaitAll(Tasks.ToArray()) 

當我打電話Task.WaitAll(Tasks.ToArray()),它同時執行所有任務預期。然而,通過線程方法調試/步進有點難,因此我希望能夠同步執行所有這些(我會在配置文件中創建一個AppSetting,以便確定是否要同步或異步運行任務)。但是,在使用.StartNew()創建的任務上調用.RunSynchronously()會引發異常。

我該如何構建這個任務列表,以便在同步和異步執行之間切換?

編輯:概念,這裏是我想要做的是什麼:

If ConfigurationManager.AppSettings("ExecuteAsynchronously") = "1" Then 
    Task.WaitAll(Tasks.ToArray()) 
Else 
    Task.WaitAllAsynchronously(Tasks.ToArray()) 
End If 

我知道.WaitAllAsynchronously()不存在,但你仍然可以看到什麼,我試圖達到的最終結果。如果我必須創建一個名爲.WaitAllAsynchronously()的擴展方法來遍歷每個任務並同步執行,那麼我將這麼做。

由於.StartNew()不支持同步執行,我需要構建我的任務列表而不實際啓動它們,但支持同步和異步執行。

+2

那麼不要使用TaskFactory和StartNew(),而是要創建一個新的Task。並使用子任務的內容輕鬆調試。我不知道同步訪問更容易調試...我寧願單元測試由任務調用的潛艇。 – GameAlchemist 2012-08-15 14:08:13

+0

我剛發佈了一個答案。我不想在那裏偷你的雷霆,但我已經嘗試過一次。問題是我沒有爲我剛發現我需要做的每個線程調用'.Start()'。不過,感謝您的評論。 Upvoted。 – oscilatingcretin 2012-08-15 14:48:52

回答

0

您可以使用Parallel.Invoke並將其設置爲使用單個線程。

Dim po AS new ParallelOptions() 
po.MaxDegreeOfParallelism = 1 

Parallel.Invoke(po, 
       Sub() 
        System.Threading.Thread.Sleep(3000) 
       End Sub, 
       Sub() 
        System.Threading.Thread.Sleep(3000) 
       End Sub 
       ) 
+0

這不是同步的,只是順序的 – 2012-08-15 14:44:14

0

我想通過任務來完成我想要的任務。我只打算刪除我的問題,但我覺得其他人可能會受益於此,所以這裏是我做過什麼:

Dim ExecuteSynchonously As Boolean = True 

Dim Tasks As New List(Of Task) 

Tasks.Add(New Task(Sub() 
         System.Threading.Thread.Sleep(3000) 
        End Sub)) 

Tasks.Add(New Task(Sub() 
         System.Threading.Thread.Sleep(3000) 
        End Sub)) 

'will create helper extension methods for these 
If ExecuteSynchonously Then 
    Tasks.ForEach(Sub(t) 
         t.RunSynchronously() 
        End Sub) 
Else 
    Tasks.ForEach(Sub(t) 
         t.Start() 
        End Sub) 
    Task.WaitAll(Tasks.ToArray) 
End If 

首先,我建立了通過添加非啓動的任務到集合的集合(而不是到.StartNew())。你可以跟隨其他。我最終會爲這些創建輔助方法,但是這至少會顯示我使用的核心代碼。

如果有人看到更有效的方式來做到這一點,請讓我知道。