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

时间: 2015-06-30

C#实现多线程写入同一个文件的方法

本文实例讲述了C#实现多线程写入同一个文件的方法.分享给大家供大家参考.具体实现方法如下: namespace WfpApp { public partial class Form2 : Form { object obj = new object(); public Form2() { InitializeComponent(); System.Threading.Thread thread; string[] users = new string[] { "zkk", "

C#基于委托实现多线程之间操作的方法

本文实例讲述了C#基于委托实现多线程之间操作的方法.分享给大家供大家参考,具体如下: 有的时候我们要起多个线程,更多的时候可能会有某个线程会去操作其他线程里的属性. 但是线程是并发的,一般的调用是无法实现我们的要求的. 于是,我们在这里就可以用委托,代码如下 private delegate void DelegateInfo(); private delegate void DelegateIsEnd(); //这个是线程调用其他线程的方法 private void Dowork() { //

C#多线程编程详解

C#提供了丰富的多线程操作,为编程带来了极大的便利. 一.使用线程的理由 1.可以使用线程将代码同其他代码隔离,提高应用程序的可靠性. 2.可以使用线程来简化编码. 3.可以使用线程来实现并发执行. 二.基本知识 1.进程与线程:进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源. 2.前台线程和后台线程:通过Thread类新建线程默认为前台线程.当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常. 3.挂起(Suspend)

解析C#多线程编程中异步多线程的实现及线程池的使用

0.线程的本质 线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度. 1.多线程: 使用多个处理句柄同时对多个任务进行控制处理的一种技术.据博主的理解,多线程就是该应用的主线程任命其他多个线程去协助它完成需要的功能,并且主线程和协助线程是完全独立进行的.不知道这样说好不好理解,后面慢慢在使用中会有更加详细的讲解. 2.多线程的使用: (1)最简单.最原始的使用方法:Thread oGetArgThre

C#使用读写锁三行代码简单解决多线程并发的问题

在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文件并不允许多个线程同时写入,否则会提示"文件正在由另一进程使用,因此该进程无法访问此文件". 这是文件的并发写入问题,就需要用到线程同步.而微软也给线程同步提供了一些相关的类可以达到这样的目的,本文使用到的 System.Thr

C#实现多线程下载文件的方法

本文实例讲述了C#实现多线程下载文件的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Threading; using System.Net; namespace WfpApp { public class MultiDownload { #region 变量 pri

C#在Unity游戏开发中进行多线程编程的方法

在这之前,有很多人在质疑Unity支不支持多线程,事实上Unity是支持多线程的.而提到多线程就要提到Unity非常常用的协程,然而协程并非真正的多线程.协程其实是等某个操作完成之后再执行后面的代码,或者说是控制代码在特定的时机执行.而多线程在Unity渲染和复杂逻辑运算时可以高效的使用多核CPU,帮助程序可以更高效的运行.本篇主要介绍在Unity中如何使用多线程. 首先引入C#中使用多线程的类库 using System.Threading; 创建线程实例的四种方式 一.线程执行无参方法 构造

C#如何对多线程、多任务管理(demo)

下面一段内容有项目需求有项目分析,通过一个小demo给大家展示下C#如何对多线程.多任务管理的. 项目需求:假设多个任务需要执行,每个任务不是一时半会能完成(需要能看到中间执行状况): 多个任务 根据条件不同 可能需要不同的处理 项目分析: 多线程并发执行多任务: 对任务进行管理,追踪中间执行状态: 运用策略模式抽象执行类: public enum TaskStatus { wait = 0, working = 1, stop = 2, suspend = 3, complete = 4, f

C#多线程经典示例(吃苹果)

本文主要讲述了多线程开发中经典示例,通过本示例,可以加深对多线程的理解. 示例概述: 下面用一个模拟吃苹果的实例,说明C#中多线程的实现方法.要求开发一个程序实现如下情况:一个家庭有三个孩子,爸爸妈妈不断削苹果往盘子里面放,老大.老二.老三不断从盘子里面取苹果吃.盘子的大小有限,最多只能放5个苹果,并且爸妈不能同时往盘子里面放苹果,妈妈具有优先权.三个孩子取苹果时,盘子不能为空,三人不能同时取,老三优先权最高,老大最低.老大吃的最快,取的频率最高,老二次之. 涉及到知识点: 线程Thread 创

C#队列Queue多线程用法实例

本文实例讲述了C#队列Queue多线程用法.分享给大家供大家参考.具体分析如下: 这里展示一个例子,供学习使用: private void button_测试Queue结合多线程_Click(object sender, EventArgs e) { Console.WriteLine("初始化队列"); queue = new Queue<string>(); string[] cars = new string[]{"宝马","奔驰&quo

python多线程用法实例详解

本文实例分析了python多线程用法.分享给大家供大家参考.具体如下: 今天在学习尝试学习python多线程的时候,突然发现自己一直对super的用法不是很清楚,所以先总结一些遇到的问题.当我尝试编写下面的代码的时候: 复制代码 代码如下: class A():     def __init__( self ):         print "A" class B( A ):     def __init__( self ):         super( B, self ).__in

jQuery中queue()方法用法实例

本文实例讲述了jQuery中queue()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够显示或者操作在匹配元素上执行的函数队列. 此方法可能用的并不是太频繁,但是却非常的重要,下面就结合实例来介绍一下次方法的用法. 根据方法参数的不同,作用也有所不同. 说明:建议结合dequeue()函数一起学习. 语法结构一: 复制代码 代码如下: $("selector").queue(queueName) 参数列表: 参数 描述 queueName 可选. 第一个匹配元素上动画队列的

JavaScript数据结构与算法之队列原理与用法实例详解

本文实例讲述了JavaScript数据结构与算法之队列原理与用法.分享给大家供大家参考,具体如下: 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素反而被优先处理.我们现在可以把队列想象对我们去餐馆吃饭的情景,很多人排队吃饭,排在最前面的人先打饭.新来的人只能在后面排队.直到轮到他们为止. 一:对队列的操作 队列有2种主要的操作,向队尾中插入新元素enqueue()方法和删除队列中的队首的元

Java延迟队列原理与用法实例详解

本文实例讲述了Java延迟队列原理与用法.分享给大家供大家参考,具体如下: 延时队列,第一他是个队列,所以具有对列功能第二就是延时,这就是延时对列,功能也就是将任务放在该延时对列中,只有到了延时时刻才能从该延时对列中获取任务否则获取不到-- 应用场景比较多,比如延时1分钟发短信,延时1分钟再次执行等,下面先看看延时队列demo之后再看延时队列在项目中的使用: 简单的延时队列要有三部分:第一实现了Delayed接口的消息体.第二消费消息的消费者.第三存放消息的延时队列,那下面就来看看延时队列dem

Java数组队列概念与用法实例分析

本文实例讲述了Java数组队列概念与用法.分享给大家供大家参考,具体如下: 一.队列的概念 (1)队列也是一种线性结构 (2)相比数组,队列对应的操作是数组的子集 (3)只允许在一端插入数据操作,在另一端进行删除数据操作,进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列) (4)队列是一种先进先出的数据结构(FIFO) 此处我们先来学习一下顺序队列 ,顺序队列 就是用数组实现:比如有一个n个元素的队列,数组下标0的一端是队头,入队操作就是通过数组下标一个个顺序追加,不需要

jQuery中队列queue()函数的实例教程

如果当前jQuery对象匹配多个元素:获取队列时,只获取第一个匹配元素上的队列:设置队列(替换队列.追加函数)时,则为每个匹配元素都分别进行设置. 该函数属于jQuery对象(实例).如果需要移除并执行队列中的第一个函数,请使用dequeue()函数.你也可以使用clearQueue()函数清空指定的队列. 语法 jQuery 1.2 新增该函数.queue()函数具有如下两种用法: 用法一: jQueryObject.queue( [ queueName ] [, newQueue ] ) 如

Python多线程通信queue队列用法实例分析

本文实例讲述了Python多线程通信queue队列用法.分享给大家供大家参考,具体如下: queue: 什么是队列:是一种特殊的结构,类似于列表.不过就像排队一样,队列中的元素一旦取出,那么就会从队列中删除. 线程之间的通信可以使用队列queue来进行 线程如何使用queue.Queue[还有其他类型的对象下面讲]来通信: 1.创建一个Queue对象:对象=queue.Queue(x),x是队列容量,x可以不填,默认没有容量限制, 2.get()可以使线程从队列中获取一个元素,如果队列为空,ge

C#队列Queue用法实例分析

本文实例分析了C#队列Queue用法.分享给大家供大家参考.具体分析如下: 队列(Queue)在程序设计中扮演着重要的角色,因为它可以模拟队列的数据操作.例如,排队买票就是一个队列操作,后来的人排在后面,先来的人排在前面,并且买票请求先被处理.为了模拟队列的操作,Queue在ArrayList的基础上加入了以下限制 1.元素采用先入先出机制(FIFO,First In First Out),即先进入队列的元素必须先离开队列.最先进入的元素称为队头元素. 元素只能被添加到队尾(称为入队),不允许在

JS中的算法与数据结构之队列(Queue)实例详解

本文实例讲述了JS中的算法与数据结构之队列(Queue).分享给大家供大家参考,具体如下: 队列(Queue) 我们之前说到了栈,它是一种比较高效的数据结构,遵循 先入后出(LIFO,last-in-first-out) 的原则.而今天我们要讨论的队列,它也是一种特殊的列表,它与栈不同的是, 队列只能在队尾插入元素,在队首删除元素,就像我们平时排队买票一样~ 队列用于存储按顺序排列的数据,遵循 先进先出(FIFO,First-In-First-Out) 的原则,也是计算机常用的一种数据结构,别用