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