0

私のアプリケーションでは、次のように一連の操作を List(Of Task) に追加します。

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 を作成して、タスクを同期または非同期で実行します)。.RunSynchronously()ただし、 を使用して作成された Task を呼び出すと.StartNew()、例外がスローされます。

同期実行と非同期実行を切り替えるには、このタスクのリストをどのように作成すればよいですか?

編集: 概念的には、ここで私がやりたいことは次のとおりです。

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

.WaitAllAsynchronously()私はそれが存在しないことを知っていますが、私が達成しようとしていることの最終結果を見ることができます. .WaitAllAsynchronously()各タスクを反復処理して同期的に実行するという拡張メソッドを作成する必要がある場合は、それを実行します。

は同期実行をサポートしていないため.StartNew()、タスクのリストを実際に開始せずに作成する必要がありますが、同期実行と非同期実行の両方をサポートする方法で行います。

4

2 に答える 2

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
                )
于 2012-08-15T14:06:58.070 に答える
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())。あなたは残りに従うことができます。最終的にはこれらのヘルパー メソッドを作成しますが、これは少なくとも私が使用したコア コードを示しています。

誰かがこれを行うためのより効率的な方法を見つけたら、私に知らせてください。

于 2012-08-15T14:47:02.073 に答える