C#多线程处理多个队列数据的方法
作者:程序猴 发布时间:2021-12-26 19:31:02
标签:C#,线程,队列
本文实例讲述了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#程序设计有所帮助。


猜你喜欢
- 第一节 JAVA条件语句之if语句1.单独的if语句,语法:if(条件){条件成立时执行的代码};如果if成立时执行的语句只有一条,可以省略
- 从概念上看,值类型直接存储其值,而引用类型存储对其值的引用。这两种类型存储在内存的不同地方。在C#中,我们必须在设计类型的时候就决定类型实例
- 前言:根据ThreadPoolExecutor的构造方法,JDK提供了很多工厂方法来创建各种用途的线程池.1 newFixedThreadP
- App 启动方式冷启动App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。需要创建 App 进程,加载
- 本文实例讲述了Java Spring开发环境搭建及简单入门示例。分享给大家供大家参考,具体如下:前言虽然之前用过Spring,但是今天试着去
- 获取接口调用凭据①接口说明access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行
- 本文实例为大家分享了java导出csv格式文件的具体代码,供大家参考,具体内容如下导出csv格式文件的本质是导出以逗号为分隔的文本数据imp
- 1、long long 和 __int64在C++ Primer当中提到的64位的int只有long long,但是在实际各种各样的C++编
- 过早提升(Premature Promotion)提升速率(promotion rate), 用于衡量单位时间内从年轻代提升到老年代的数据量
- 前言C#本身提供了很强大的控件库,但是很多控件库的功能只是一些基本的功能,就比如最简单的按钮,C#提供了最基础的按钮使用方法,但是如果要增加
- mybatis自动生成代码(实体类、Dao接口等)是很成熟的了,就是使用mybatis-generator插件。 它是一个开源的插件,使用m
- 前言:本文主要介绍内容有:一个串行调用的例子(App首页信息查询)CompletionService实现并行调用抽取通用的并行调用方法代码思
- 1、说明isInterrupted()可以判断当前线程是否被中断,仅仅是对interrupt()标识的一个判断,并不会影响标识发生任何改变(
- 本文实例讲述了C#在运行时动态创建类型的实现方法。是C#项目开发中很实用的技巧。分享给大家供大家参考。具体分析如下:具体来说,C# 在运行时
- 简述偶然看到一篇关于阿里新orm框架的文章,好奇的点了进去。开发后端多年,看到这个还是有点兴奋的。常用mysql的orm框架mybatis、
- 本文实例讲述了C#实现终止正在执行的线程的实现方法,并针对一些容易出错的地方进行了深入分析,具体方法如下:一般来说,很多人都会使用Abort
- 动态数据源在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库。又比如
- 什么是Aop主要介绍springboot中aop的使用,用过Spring框架的都知道,aop是spring框架的两大核心功能之一,还有一个就
- Java 字符串反转问题:给一个字符串,比如 “I love china”, 把字符反转后变成 “china love I”思路
- java swing GUI窗口美化一般我们写出的窗口是这个样子的,文本框和按钮都不是太美观,如果按钮是原色的就更难看了。今天发现了一个更加