博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C#]如何使用ThreadPool
阅读量:6984 次
发布时间:2019-06-27

本文共 2524 字,大约阅读时间需要 8 分钟。

摘要

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

以下示例使用.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://www.cnblogs.com/wolf-sun/p/5812771.html

你可能感兴趣的文章
如何用机器学习预测超售,避免美联航“暴力赶客”悲剧
查看>>
css细节(实习第1天)
查看>>
腾讯Android自动化测试实战3.1.4 Robotium的控件获取、操作及断言
查看>>
《C语言点滴》一1.5 内功修炼
查看>>
linux 怎么完全卸载mysql数据库
查看>>
Dart的HTTP请求和响应(1)
查看>>
寻找最大的K个数,Top K问题的堆实现
查看>>
自动发布工具应该具备的11个标准特征
查看>>
页面设计四大基本原则
查看>>
2016及以后的自动化测试趋势 -《测试技术六月刊》
查看>>
基于Angular创建后台数据模拟(译)
查看>>
Spring中bean配置的继承
查看>>
用JSP实现学生查询
查看>>
企业网站怎么建设
查看>>
数据库和MySQL相关面试题目
查看>>
Yii 框架学习--01 框架入门
查看>>
All Things OpenTSDB
查看>>
android 网络通信框架volly
查看>>
二分查找算法及其变种
查看>>
一个泛型冒泡排序的实现
查看>>