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

作者:程序猴 时间:2021-12-26 19:31:02 

本文实例讲述了C#多线程处理多个队列数据的方法。分享给大家供大家参考。具体实现方法如下:


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#程序设计有所帮助。

标签:C#,线程,队列
0
投稿

猜你喜欢

  • 如何把本地jar包导入maven并pom添加依赖

    2021-12-31 04:11:28
  • Java开发环境配置方法

    2022-05-25 02:02:29
  • SpringBoot注入自定义的配置文件的方法详解

    2021-12-24 02:28:06
  • Struts2拦截器Interceptor的原理与配置实例详解

    2022-06-23 17:34:45
  • C#实现char字符数组与字符串相互转换的方法

    2022-01-18 05:28:52
  • springboot+chatgpt+chatUI Pro开发智能聊天工具的实践

    2023-10-30 05:38:03
  • JAVA集合框架Map特性及实例解析

    2021-06-05 02:23:39
  • 解决spring boot启动扫描不到自定义注解的问题

    2023-10-29 14:31:48
  • mybatis中foreach嵌套if标签方式

    2023-11-20 23:11:05
  • 搞懂Java线程池

    2021-08-04 10:01:06
  • MyBatis-Plus通过version机制实现乐观锁的思路

    2023-09-16 06:58:27
  • SVN报错:Error Updating changes:svn:E155037的解决方案

    2023-06-11 07:27:11
  • springboot实现异步任务

    2023-04-23 01:25:21
  • C# 通过反射获取类型的字段值及给字段赋值的操作

    2021-11-14 13:30:23
  • 解决Jackson解析嵌套类问题(MismatchedInputException)

    2023-07-26 03:09:31
  • java static块和构造函数的实例详解

    2021-10-04 07:30:17
  • Java Idea TranslationPlugin翻译插件使用解析

    2023-12-01 10:25:02
  • Java模拟有序链表数据结构的示例

    2023-09-26 22:25:30
  • SpringBoot实现Excel文件批量上传导入数据库

    2023-11-29 11:13:44
  • ShardingSphere解析SQL示例详解

    2023-11-23 13:57:55
  • asp之家 软件编程 m.aspxhome.com