0

正常に動作する以下のコードを継承しました。唯一の問題は、一度に実行されるスレッドの数を制限できるようにしたいことです。現時点では、並行して実行されるジョブが約8〜10個あります。スレッドの数をいつでも3または4に制限するために、これは以下のコードであまり多くの変更を加えることなく可能ですか?

Public Sub threading_Example()

 Dim threadList As New List(Of Thread)

 For n = 0 To numJobs 'about 8-10 normally

     Dim new_job As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf do_Job))
     Dim job As New Job

     'job.stuff = stuff

     newJob.Start(job)
     threadList.Add(new_job)

 Next

 For Each t As Thread In threadList
     t.Join()
 Next

End Sub

Public Sub do_Job(ByVal job As Object)
   'do task 
End Sub
4

4 に答える 4

0

使用するバージョンによっては、次のことも試してみてください。

Parallel.For(0, 10, 
            (New ParallelOptions() With {.MaxDegreeOfParallelism = 4}), 
             Sub(i As Integer)
                ' do job        
                System.Threading.Thread.Sleep(2000)
                Debug.Print("done no. {0}", i)
             End Sub)

タスクリストやスレッドへの参加は必要ありません

于 2012-10-24T12:25:30.307 に答える
0

たとえば、セマフォを使用してみてください。

ReadOnly Sem As New Semaphore(3, 4)

    Sub Main()

        Dim threadList As New List(Of Thread)
        Dim numJobs As Integer
        For n = 0 To numJobs

            Dim new_job As New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf do_Job))

            new_job.Start()
            threadList.Add(new_job)

        Next

        For Each t As Thread In threadList
            t.Join()
        Next


    End Sub


    Public Sub do_Job(ByVal job As Object)

        Sem.WaitOne()
        'only 3 or 4 threads at time can do task
        Sem.Release()
    End Sub
于 2012-10-24T12:25:54.607 に答える
0

私の提案は、スレッドプールを使用することです。スレッドプールには多くの最適化が組み込まれています。たとえば、スレッドプールは、マシンにあるコアの数を決定し、それに応じてスレッドの数をスケジュールします。作成されたスレッドの数が多いが適切に利用されていない場合、スレッドプールは追加のスレッドを強制終了します。

スレッドプールを使用してコードをリファクタリングすることを検討してください。スレッドプールには、スレッドの数を制限するオプションもあります(ただし、これはお勧めしません)。

于 2012-10-24T11:54:29.160 に答える
0

代わりにThreadPoolを使用することをお勧めします。SetMin | MaxThreadsメソッドを使用して、使用するスレッドの数を制限できます。

于 2012-10-24T11:55:21.827 に答える