Il n'est pas nécessaire de mettre en œuvre sa propre application, car il n'est pas très difficile d'utiliser l'application .NET existante.
De Documentation sur le ThreadPool :
using System;
using System.Threading;
public class Fibonacci
{
public Fibonacci(int n, ManualResetEvent doneEvent)
{
_n = n;
_doneEvent = doneEvent;
}
// Wrapper method for use with thread pool.
public void ThreadPoolCallback(Object threadContext)
{
int threadIndex = (int)threadContext;
Console.WriteLine("thread {0} started...", threadIndex);
_fibOfN = Calculate(_n);
Console.WriteLine("thread {0} result calculated...", threadIndex);
_doneEvent.Set();
}
// Recursive method that calculates the Nth Fibonacci number.
public int Calculate(int n)
{
if (n <= 1)
{
return n;
}
return Calculate(n - 1) + Calculate(n - 2);
}
public int N { get { return _n; } }
private int _n;
public int FibOfN { get { return _fibOfN; } }
private int _fibOfN;
private ManualResetEvent _doneEvent;
}
public class ThreadPoolExample
{
static void Main()
{
const int FibonacciCalculations = 10;
// One event is used for each Fibonacci object
ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations];
Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];
Random r = new Random();
// Configure and launch threads using ThreadPool:
Console.WriteLine("launching {0} tasks...", FibonacciCalculations);
for (int i = 0; i < FibonacciCalculations; i++)
{
doneEvents[i] = new ManualResetEvent(false);
Fibonacci f = new Fibonacci(r.Next(20,40), doneEvents[i]);
fibArray[i] = f;
ThreadPool.QueueUserWorkItem(f.ThreadPoolCallback, i);
}
// Wait for all threads in pool to calculation...
WaitHandle.WaitAll(doneEvents);
Console.WriteLine("All calculations are complete.");
// Display the results...
for (int i= 0; i<FibonacciCalculations; i++)
{
Fibonacci f = fibArray[i];
Console.WriteLine("Fibonacci({0}) = {1}", f.N, f.FibOfN);
}
}
}
5 votes
La réponse courte est que vous ne devriez pas écrire votre propre version, sauf s'il s'agit d'un exercice d'apprentissage. Si c'est un exercice d'apprentissage, vous apprendrez davantage en l'écrivant vous-même qu'en copiant le code de quelqu'un d'autre :)
2 votes
@Greg : N'y a-t-il pas de circonstances où vous pourriez vouloir un pool de threads indépendant du ThreadPool standard existant ?
1 votes
@Anthony : En lisant ce qui a été fait pour le threadpool intégré dans les différents posts de Joe Duffy (et d'autres), je suis raisonnablement confiant que n'importe quel threadpool que je mettrais ensemble serait beaucoup plus faible que celui qui existe déjà.