0

各関数呼び出しを個別に処理し、時間の消費を避けるためにいくつかのスレッドを必要とする vb.net サービスがあります。

スレッドを実装する必要がある 2 つの関数があります。

私の質問をする前に、ここに私の2つの機能があります:

1- LaunchTasks() : タスクが適切に起動された場合、このタスクの「NextRunDate」が計算されます。それ以外の場合はスキップされます。

'Dim oThread As Threading.Thread
For Each oRow As DataRow In oDatatable.Rows
    Dim oCLASSE_Task As New CLASSE_Task
    If oCLASSE_Task.Load(oRow.Item("Mytask")) Then

        'oThread = New Threading.Thread(AddressOf oTask.launchSteps)
        'oThread.Priority = Threading.ThreadPriority.Normal
        'oThread.Start()

        Dim oThread = System.Threading.Tasks.Task(Of Boolean).Factory.StartNew(Function() oCLASSE_Task.launchSteps())

    End If
Next
' Need to wait until all threads finish

2-calculateRunDates()

'It's called for each object in CLASSE_Task

'Dim oThread As Threading.Thread
For Each oRow As DataRow In oDatatable.Rows
    Dim oCLASSE_Task As New CLASSE_Task
    If oCLASSE_Task.Load(oRow.Item("Mytask")) Then

        Dim oThreadTask = System.Threading.Tasks.Task(Of Boolean).Factory.StartNew(Function() oCLASSE_Task.calculateNextRunDate())

        'oThread = New Threading.Thread(AddressOf oTask.calculateNextRunDate)
        'oThread.Priority = Threading.ThreadPriority.Normal
        'oThread.Start()

    End If
Next
' Need to wait until all threads finish

私は常に LaunchTask() を最初に呼び出し、次に calculateRunDates() を呼び出します (データベースに新しいレコードを取得した場合)。

関数 LaunchTask() のすべてのスレッドが終了するまで待ってから、calculateRunDates() を開始する必要があります。

  • thread.join() のような TPL (以前は使用したことがありません) を使用してこれを行うにはどうすればよいですか?

  • この状況では、スレッドまたは TPL を使用する必要がありますか?

  • サービスでTPLを使用して例外を処理するにはどうすればよいですか(そのようなもの)?

注: SyncLock を使用して CLASSE_Task をロックしています。

vb.net、主に C# を使用した例は十分ではありません。

私が十分に明確であることを願っています。

4

2 に答える 2

2

まず、あなたの質問に答えるために:

thread.join() のような TPL (以前は使用したことがありません) を使用してこれを行うにはどうすればよいですか?

そのために使うべきtask.Wait()です。数秒間待ちたい場合はTask、 を使用できますTask.WaitAll()

この状況では、スレッドまたは TPL を使用する必要がありますか?

TPL を使用する必要があります。より使いやすく、より効率的です。

サービスでTPLを使用して例外を処理するにはどうすればよいですか?

a 内のコードがTask例外をスローした場合、Wait()そのコードTask(またはWaitAll()複数Taskの s) で、スローさAggregateExceptionれた例外を含めてスローされます。を呼び出さない場合は、リンク先の質問が示唆するように、Wait()を使用できます。ContinueWith()


しかし、あなたのコードでは、 を使用する方が良いと思いParallel.ForEach()ます.返されると、すべての反復が完了します。TaskTask

Parallel.ForEach(oDatatable.Rows.Cast(Of DataRow)(),
                 Sub(oRow)
                     Dim oCLASSE_Task As New CLASSE_Task
                     If oCLASSE_Task.Load(oRow.Item("Mytask")) Then
                         oCLASSE_Task.launchSteps()
                     End If
                 End Sub)
于 2012-08-13T19:03:50.543 に答える
1

複数のタスクの完了を待つには、Task.WaitAll(...) メソッドを使用できます。例については、これを参照してください。この記事では、タスクによって例外がスローされた場合の例外の処理方法も示します。Task.WaitAll() の周りに try/catch を配置し、キャッチされた AggregateException を調べて、タスクによってスローされた個々の例外を取得します。

ただし、よりインテリジェントなループ パーティションを提供する Parallel.ForEach API を使用すると、コードにメリットがあるようです。行ごとに個別のタスクを作成するだけでは、スレッド プールが過負荷になる可能性があります。

于 2012-08-13T19:01:43.027 に答える