• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#多线程排队队列实现的源码

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
[csharp] view plaincopy
  1. using System;  
  2.   
  3. using System.Threading;  
  4.   
  5. using System.Collections;  
  6.   
  7. using System.Collections.Generic;  
  8.   
  9.   
  10. // 将线程同步事件封装在此类中,   
  11.   
  12. // 以便于将这些事件传递给 Consumer 和  
  13.   
  14. // Producer 类。  
  15.   
  16. public class SyncEvents  
  17.   
  18. {  
  19.   
  20.     public SyncEvents()  
  21.   
  22.     {  
  23.   
  24.         // AutoResetEvent 用于“新项”事件,因为  
  25.   
  26.         // 我们希望每当使用者线程响应此事件时,  
  27.   
  28.         // 此事件就会自动重置。  
  29.   
  30.         _newItemEvent = new AutoResetEvent(false);  
  31.   
  32.   
  33.         // ManualResetEvent 用于“退出”事件,因为  
  34.   
  35.         // 我们希望发出此事件的信号时有多个线程响应。  
  36.   
  37.         // 如果使用 AutoResetEvent,事件  
  38.   
  39.         // 对象将在单个线程作出响应之后恢复为   
  40.   
  41.         // 未发信号的状态,而其他线程将  
  42.   
  43.         // 无法终止。  
  44.   
  45.         _exitThreadEvent = new ManualResetEvent(false);  
  46.   
  47.   
  48.         // 这两个事件也放在一个 WaitHandle 数组中,以便  
  49.   
  50.         // 使用者线程可以使用 WaitAny 方法  
  51.   
  52.         // 阻塞这两个事件。  
  53.   
  54.         _eventArray = new WaitHandle[2];  
  55.   
  56.         _eventArray[0] = _newItemEvent;  
  57.   
  58.         _eventArray[1] = _exitThreadEvent;  
  59.   
  60.     }  
  61.   
  62.   
  63.     // 公共属性允许对事件进行安全访问。  
  64.   
  65.     public EventWaitHandle ExitThreadEvent  
  66.   
  67.     {  
  68.   
  69.         get { return _exitThreadEvent; }  
  70.   
  71.     }  
  72.   
  73.     public EventWaitHandle NewItemEvent  
  74.   
  75.     {  
  76.   
  77.         get { return _newItemEvent; }  
  78.   
  79.     }  
  80.   
  81.     public WaitHandle[] EventArray  
  82.   
  83.     {  
  84.   
  85.         get { return _eventArray; }  
  86.   
  87.     }  
  88.   
  89.   
  90.     private EventWaitHandle _newItemEvent;  
  91.   
  92.     private EventWaitHandle _exitThreadEvent;  
  93.   
  94.     private WaitHandle[] _eventArray;  
  95.   
  96. }  
  97.   
  98.   
  99. // Producer 类(使用一个辅助线程)  
  100.   
  101. // 将项异步添加到队列中,共添加 20 个项。  
  102.   
  103. public class Producer   
  104.   
  105. {  
  106.   
  107.     public Producer(Queue<int> q, SyncEvents e)  
  108.   
  109.     {  
  110.   
  111.         _queue = q;  
  112.   
  113.         _syncEvents = e;  
  114.   
  115.     }  
  116.   
  117.     public void ThreadRun()  
  118.   
  119.     {  
  120.   
  121.         int count = 0;  
  122.   
  123.         Random r = new Random();  
  124.   
  125.         while (!_syncEvents.ExitThreadEvent.WaitOne(0, false))  
  126.   
  127.         {  
  128.   
  129.             lock (((ICollection)_queue).SyncRoot)  
  130.   
  131.             {  
  132.   
  133.                 while (_queue.Count < 20)  
  134.   
  135.                 {  
  136.   
  137.                     _queue.Enqueue(r.Next(0, 100));  
  138.   
  139.                     _syncEvents.NewItemEvent.Set();  
  140.   
  141.                     count++;  
  142.   
  143.                 }  
  144.   
  145.             }  
  146.   
  147.         }  
  148.   
  149.         Console.WriteLine("Producer thread: produced {0} items", count);  
  150.   
  151.     }  
  152.   
  153.     

    鲜花

    握手

    雷人

    路过

    鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#方法名前的方括号是干嘛用的呀?发布时间:2022-07-13
下一篇:
C#制定内容写入文件(HTML,txt等)发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap