首页 > 代码库 > [C#]如何使用ThreadPool

[C#]如何使用ThreadPool

摘要

线程池是一种多线程的形式,其中的任务被添加到队列中,并在创建线程时自动启动。

以下示例使用.Net框架的线程池来计算十个数字20和40之间的裴波那契的结果。裴波那契Fibonacci类,它提供了一种方法叫ThreadPoolCallback执行计算。一个对象表示一个裴波那契的值被创建,ThreadPoolCallback方法是通过queueuserworkitem分配可能的线程池中执行的方法。

因为每个裴波那契对象提供一个半随机值来计算,因为每个线程将竞争处理器时间,你不能提前知道多久将采取所有是个结果来计算。这就是为什么每个裴波那契对象传递的manualresetevent类的一个实例在施工。每个对象的信号提供的事件对象计算完成,这使主线程阻止执行waitall直到所有的裴波那契对象计算结果。然后main函数显示结果。

一个例子

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace ThreadPoolDemo{    class Program    {        static void Main(string[] args)        {            const int FibonacciCalculations = 10;            ManualResetEvent[] doneEvents = new ManualResetEvent[FibonacciCalculations];            Fibonacci[] fibArray = new Fibonacci[FibonacciCalculations];            Random r = new Random();            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 calculate            WaitHandle.WaitAll(doneEvents);            for (int i = 0; i < FibonacciCalculations; i++)            {                Fibonacci f = fibArray[i];                Console.WriteLine("Fibonacci({0})={1}", f.N, f.FibofN);            }            Console.Read();        }    }    public class Fibonacci    {        private int _n;        private int _fibofN;        private ManualResetEvent _doneEvent;        public int N { get { return _n; } }        public int FibofN { get { return _fibofN; } }        public Fibonacci(int n, ManualResetEvent doneEvent)        {            _n = n;            _doneEvent = doneEvent;        }        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();        }        public int Calculate(int n)        {            if (n <= 1)            {                return n;            }            return Calculate(n - 1) + Calculate(n - 2);        }    }}

结果

技术分享

参考

https://msdn.microsoft.com/en-us/library/mt679040.aspx

[C#]如何使用ThreadPool