专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

C#多线程处理多个队列的数据

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 1:17:19       共计:3611 浏览
public static void Testing(Form sender, DelegateShowStateInfo method)
{
   _StateMethod = method;
   _OwnerForm = sender;
   _Exit = false;
   
   ThreadPool.QueueUserWorkItem(MainTestThread);
   ThreadPool.QueueUserWorkItem(Queue1Thread); //啟動Queue1線程
   ThreadPool.QueueUserWorkItem(Queue2Thread); //啟動Queue2線程

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Collections;
using System.Windows.Forms;

 
namespace ThredProcessQueue
{
   //用于顯示狀態的代理方法類型定義
   public delegate void DelegateShowStateInfo(string state);
   
   /// <summary>
   /// 測試器
   /// </summary>
   public class QueueTester
   {
      private static bool _Exit = false; //標記是否已中斷測試程序
      private static Form _OwnerForm; //測試的窗體
      private static DelegateShowStateInfo _StateMethod;
      
      private static IList _Queue1 = new ArrayList(); //Queue1的數據
      private static IList _Queue2 = new ArrayList(); //Queue2的數據
      private static IList _Queue3 = new ArrayList(); //Queue3的數據
      
      
      public static void StopThread()
      {
         _Exit = true;
         _OwnerForm = null;
      }
      
      public static void Testing(Form sender, DelegateShowStateInfo method)
      {
         _StateMethod = method;
         _OwnerForm = sender;
         _Exit = false;
         
         ThreadPool.QueueUserWorkItem(MainTestThread);
         ThreadPool.QueueUserWorkItem(Queue1Thread); //啟動Queue1線程
         ThreadPool.QueueUserWorkItem(Queue2Thread); //啟動Queue2線程
      }
      
      //測試用的主線程,循環向隊列1中壓入數據。
      public static void MainTestThread(object state)
      {
         Random R = new Random(1);
         double V = 0;
         
         while (_Exit == false)
         {
            //在while(true)里一直对数据进行读取,然后放到queue1中,
            //与此同时如果queue1中有数据,则线程1就开启
            
            //臨時數據,隨機數
            V = R.NextDouble();
            
            _Queue1.Add(V); //把數據插入到隊列1
            Application.DoEvents();
            
            ShowState();
            
            Thread.Sleep(100);//生成隨機數太快,為了看清效果,暫停n毫秒
         }
      }
      
      
      //对queue1中的数据进行处理,处理后放到queue2中
      public static void Queue1Thread(object state)
      {
         while (_Exit == false)
         {
            while (_Queue1.Count > 0)
            {
               //对queue1中的数据进行处理,处理后放到queue2中
               _Queue2.Add(_Queue1[0]);
               _Queue1.RemoveAt(0);
               Application.DoEvents();
               
               ShowState();
            }
         }
      }
      
      //对queue2中的数据进行处理,处理后放到queue3中
      public static void Queue2Thread(object state)
      {
         while (_Exit == false)
         {
            while (_Queue2.Count > 0)
            {
               //对queue1中的数据进行处理,处理后放到queue2中
               _Queue3.Add(_Queue2[0]);
               _Queue2.RemoveAt(0);
               Application.DoEvents();
               
               ShowState();
            }
         }
      }
      
      //用于監視各隊列狀態的線程
      public static void ShowState()
      {
         string stateInfo =
         QueueTester._Queue1.Count.ToString() " -> "
         QueueTester._Queue2.Count.ToString() " -> "
         QueueTester._Queue3.Count.ToString();
         
         try
         {
            if (_OwnerForm != null)
            {
               _OwnerForm.Invoke(_StateMethod, stateInfo);
               Application.DoEvents();
            }
         }
         catch
         {
            
         }
      }
      
   }
   
}

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:C#多线程用法详解 | ·下一条:Post并发请求在C#多线程是如何处理实现

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有