C#线程池的代码

C#线程池的代码,第1张

概述C#线程池的代码

下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。

内存溢出小编现在分享给大家,也给大家做个参考。

    sealed class MyThreadPool          {              //线程锁对象              private static object lockObj = new object();              //任务队列              private static Queue<ThreadStart> threadStartQueue = new Queue<ThreadStart>();              //记录当前工作的任务集合,从中可以判断当前工作线程使用数,如果使用int判断的话可能会有问题,              //用集合的话还能取得对象的引用,比较好              private static HashSet<ThreadStart> threadsWorker = new HashSet<ThreadStart>();              //当前允许最大工作线程数              private static int maxThreaDWorkerCount = 1;              //当前允许最小工作线程数              private static int minThreaDWorkerCount = 0;              /// <summary>              /// 设定最大工作线程数              /// </summary>              /// <param name="maxThreadCount">数量</param>              public static voID SetMaxWorkThreadCount(int maxThreadCount)              {                  maxThreaDWorkerCount = minThreaDWorkerCount > maxThreadCount ?                  minThreaDWorkerCount : maxThreadCount;              }              /// <summary>              /// 设定最小工作线程数              /// </summary>              /// <param name="maxThreadCount">数量</param>              public static voID SetMinWorkThreadCount(int minThreadCount)              {                  minThreaDWorkerCount = minThreadCount > maxThreaDWorkerCount ?                  maxThreaDWorkerCount : minThreadCount;              }              /// <summary>              /// 启动线程池工作              /// </summary>              /// <param name="threadStartArray">任务数组</param>              public static voID MyQueueUserWorkItem(List<ThreadStart> threadStartArray)              {                  //将任务集合都放入到线程池中                  AddAllThreadstopool(threadStartArray);                  //线程池执行任务                  ExcuteTask();              }              /// <summary>              /// 将单一任务加入队列中              /// </summary>              /// <param name="ts">单一任务对象</param>              private static voID AddThreadToQueue(ThreadStart ts)              {                  lock (lockObj)                  {                      threadStartQueue.Enqueue(ts);                  }              }              /// <summary>              /// 将多个任务加入到线程池的任务队列中              /// </summary>              /// <param name="threadStartArray">多个任务</param>              private static voID AddAllThreadstopool(List<ThreadStart> threadStartArray)              {                  foreach (var threadStart in threadStartArray)                      AddThreadToQueue(threadStart);              }              /// <summary>              /// 执行任务,判断队列中的任务数量是否大于0,如果是则判断当前正在使用的工作线程的              /// 数量是否大于等于允许的最大工作线程数,如果一旦有线程空闲的话              /// 就会执行ExcuteTaskInQueen方法处理任务              /// </summary>              private static voID ExcuteTask()              {                  while (threadStartQueue.Count > 0)                  {                      Thread.Sleep(100);                      if (threadsWorker.Count < maxThreaDWorkerCount)                      {                          ExcuteTaskInQueen();                      }                  }              }              /// <summary>              /// 执行出对列的任务,加锁保护              /// </summary>              private static voID ExcuteTaskInQueen()              {                  lock (lockObj)                  {                      ExcuteTaskByThread(      threadStartQueue.Dequeue());                  }              }              /// <summary>              /// 实现细节,这里使用BackGrouDWork来实现后台线程              /// 注册doWork和Completed事件,当执行一个任务前,前将任务加入到              /// 工作任务集合(表示工作线程少了一个空闲),一旦RunWorkerCompleted事件被触发则将任务从工作              /// 任务集合中移除(表示工作线程也空闲了一个)              /// </summary>              /// <param name="threadStart"></param>              private static voID ExcuteTaskByThread(ThreadStart threadStart)              {                  threadsWorker.Add(threadStart);                  BackgrounDWorker worker = new BackgrounDWorker();                  worker.DoWork += (o,e) => { threadStart.Invoke(); };                  worker.RunWorkerCompleted += (o,e) => { threadsWorker.Remove(threadStart); };                  worker.RunWorkerAsync();              }          }  

以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

总结

以上是内存溢出为你收集整理的C#线程池的代码全部内容,希望文章能够帮你解决C#线程池的代码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1237640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存