# How to: Use a Thread Pool (C# and Visual Basic)

**Visual Studio 2010**

Thread pooling is a form of multithreading in which tasks are added to a queue and automatically started when threads are created. For more information, see Thread Pooling (C# and Visual Basic).

The following example uses the .NET Framework thread pool to calculate the Fibonacci result for ten numbers between 20 and 40. Each Fibonacci result is represented by the Fibonacci class, which provides a method named ThreadPoolCallback that performs the calculation. An object that represents each Fibonacci value is created, and the ThreadPoolCallback method is passed to QueueUserWorkItem, which assigns an available thread in the pool to execute the method.

Because each Fibonacci object is given a semi-random value to compute, and because each thread will be competing for processor time, you cannot know in advance how long it will take for all ten results to be calculated. That is why each Fibonacci object is passed an instance of the ManualResetEvent class during construction. Each object signals the provided event object when its calculation is complete, which allows the primary thread to block execution with WaitAll until all ten Fibonacci objects have calculated a result. The Main method then displays each Fibonacci result.

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 ThreadPoolCallBack(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 = 9 ' 0 to 9 ' 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.ThreadPoolCallBack, i) Next ' Wait for all threads in pool to calculate. WaitHandle.WaitAll(doneEvents) Console.WriteLine("All calculations are complete.") ' Display the results. For i As Integer = 0 To FibonacciCalculations Dim f As Fibonacci = fibArray(i) Console.WriteLine("Fibonacci({0}) = {1}", f.N, f.FibOfN) Next End Sub End Module

Following is an example of the output.

launching 10 tasks... thread 0 started... thread 1 started... thread 1 result calculated... thread 2 started... thread 2 result calculated... thread 3 started... thread 3 result calculated... thread 4 started... thread 0 result calculated... thread 5 started... thread 5 result calculated... thread 6 started... thread 4 result calculated... thread 7 started... thread 6 result calculated... thread 8 started... thread 8 result calculated... thread 9 started... thread 9 result calculated... thread 7 result calculated... All calculations are complete. Fibonacci(38) = 39088169 Fibonacci(29) = 514229 Fibonacci(25) = 75025 Fibonacci(22) = 17711 Fibonacci(38) = 39088169 Fibonacci(29) = 514229 Fibonacci(29) = 514229 Fibonacci(38) = 39088169 Fibonacci(21) = 10946 Fibonacci(27) = 196418