c#之线程池优先级

Posted 忧郁的小学生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#之线程池优先级相关的知识,希望对你有一定的参考价值。

using System;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ManualResetEvent rem = new ManualResetEvent(false);  //设置信号灯为无状态
            ThreadPool.SetMaxThreads(3, 3);
            thr t = new thr(15, rem);
            for (int i = 0; i < 15; i++) 
            {
         
              ThreadPool.QueueUserWorkItem(new WaitCallback(t.met),i);
            }
            rem.WaitOne(Timeout.Infinite, true);
            Console.WriteLine("断点测试");
            Thread.Sleep(10000);
            Console.WriteLine("运行结束");
            Console.ReadKey();
        }

        
    }

    public class thr 
    {
        public thr(int count,ManualResetEvent res) 
        {
            iMaxCount1 = count;
            evens = res;

        }

        public static int icount = 0;
        public static int iMaxCount1 = 0;
        public ManualResetEvent evens;
        public void met(object i)
        {
            Console.WriteLine("thgead[" + i.ToString() + "]");
            Thread.Sleep(2000);
            //Interlocked.Increment()操作是一个原子操作,作用是:iCount++ 具体请看下面说明 
            //原子操作,就是不能被更高等级中断抢夺优先的操作。你既然提这个问题,我就说深一点。
            //由于操作系统大部分时间处于开中断状态,
            //所以,一个程序在执行的时候可能被优先级更高的线程中断。
            //而有些操作是不能被中断的,不然会出现无法还原的后果,这时候,这些操作就需要原子操作。
            //就是不能被中断的操作。
            Interlocked.Increment(ref icount);
            if (icount == iMaxCount1)
            {
                Console.WriteLine("发出结束信号!");
                //将事件状态设置为终止状态,允许一个或多个等待线程继续。
                evens.Set();
            }
        }

       

       
    }
}

  

以上是关于c#之线程池优先级的主要内容,如果未能解决你的问题,请参考以下文章

C# 显式创建线程 or 使用线程池线程--new Thread() or ThreadPool.QueueUserWorkItem()

《C#零基础入门之百识百例》(九十七)线程介绍 -- Thread类 -- 开启线程的几种方式

《C#零基础入门之百识百例》(九十七)线程介绍 -- Thread类 -- 开启线程的几种方式

C#多线程之线程池篇2

《CLR via C#》之线程处理——线程池与任务

C#多线程之线程池篇3