Я экспериментировал с примерами пула потоков. Я начал с Fibonacci example on MSDN web site, но this wasn't suitable for more than 64 calculations, поэтому я уже решены с этим кодом:Какое правильное использование функции WaitOne()
Imports System.Threading
Module Module1
Public Class Fibonacci
Private _n As Integer
Private _fibOfN
Private _doneEvent As ManualResetEvent
Public ReadOnly Property N() As Integer
Get
Return _n
End Get
End Property
Public ReadOnly Property FibOfN() As Integer
Get
Return _fibOfN
End Get
End Property
Sub New(ByVal n As Integer, ByVal doneEvent As ManualResetEvent)
_n = n
_doneEvent = doneEvent
End Sub
' Wrapper method for use with the thread pool.
Public Sub ThreadPoolCallBackMar(ByVal threadContext As Object)
Dim threadIndex As Integer = CType(threadContext, Integer)
Console.WriteLine("thread {0} started...", threadIndex)
_fibOfN = Calculate(_n)
Console.WriteLine("thread {0} result calculated...", threadIndex)
_doneEvent.Set()
End Sub
Public Function Calculate(ByVal n As Integer) As Integer
If n <= 1 Then
Return n
End If
Return Calculate(n - 1) + Calculate(n - 2)
End Function
End Class
<MTAThread()>
Sub Main()
Const FibonacciCalculations As Integer = 65
' One event is used for each Fibonacci object
Dim doneEvents(FibonacciCalculations) As ManualResetEvent
Dim fibArray(FibonacciCalculations) As Fibonacci
Dim r As New Random()
' Configure and start threads using ThreadPool.
Console.WriteLine("launching {0} tasks...", FibonacciCalculations)
For i As Integer = 0 To FibonacciCalculations
doneEvents(i) = New ManualResetEvent(False)
Dim f = New Fibonacci(r.Next(20, 40), doneEvents(i))
fibArray(i) = f
ThreadPool.QueueUserWorkItem(AddressOf f.ThreadPoolCallBackMar, i)
Next
Console.WriteLine("All calculations are complete.")
For i As Integer = 0 To FibonacciCalculations
doneEvents(i).WaitOne()
Dim f As Fibonacci = fibArray(i)
Console.WriteLine("Fibonacci({0}) = {1}", f.N, f.FibOfN)
Next
Console.Read()
End Sub
End Module
Использование WaitOne()
вместо WaitAll()
решить эту проблему, но вопрос: если мне не нужно, чтобы отобразить результаты тогда мне не нужен ни второй цикл, но ... без второго цикла, где я должен поставить функцию waitOne()
?
Переключитесь на использование TPL, чтобы свернуть ваши 50 строк резьбы в 5. Используйте 'Parallel.For'. Или вы настаиваете на том, чтобы делать это по-старому? – usr
Прямо сейчас старый путь, но новый способ действительно интересен ... –
Эту проблему можно решить, применив что-то, называемое «чувство лошади». Очень важный программист. Если вы не хотите отображать результат, не запускайте поток. Таким образом, вам не нужен WaitOne(). –