C#多線程處理多個隊列的數據


 
C# 多線程處理多個隊列的數據
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線程
}


// 來源:www.CSFramework.com, C/S結構框架學習網




貼圖圖片



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

// C/S框架網 www.csframework.com
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
         {
            
         }
      }
      
   }
   
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM