• [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

  • 相关阅读:
    yaml简单模板
    goland之基础使用 X
    redis之性能优化 X
    定时任务管理之qinglong X
    golang数据库操作之gorm X
    低代码平台汇总 X
    kafka之介绍 X
    ClickHouse之基础 X
    gitlab安装与基本使用 X
    ClickHouse之物化MySQL X
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/5812771.html
Copyright © 2020-2023  润新知