C#异步数据处理-WorkQueue

介绍

工作队列主要用于异步处理消息,详细介绍参考其他文章,这里主要提供使用方法

类似方法有List、HashMap、Dir,但是性能略逊一筹。

场景举例

硅晶片标刻:

通讯协议采用TCP协议

1、程序(Server)对接上游LAMA机器(Client),接受标刻条码信息。

2、程序(Client)控制激光打标机(Server),在硅晶片上标刻条码

3、程序(Client)读取扫码器(Server)读码信息,并于标刻条码信息对比

简单调用举例

struct recivecode
    {
        public string ID;
        public string STATION;
    }
WorkQueue<recivecode> l_queue = new WorkQueue<recivecode>();
WorkQueue<long> l_markcode = new WorkQueue<long>();
recivecode REC = new recivecode();
REC.ID = IDimforation;
REC.STATION = station;
l_queue.EnqueueBox(REC);
recivecode code = l_queue.TryDequeueBox();
Console.WriteLine(code.ID);

源代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Concurrent;
using System.Threading;

namespace laser_code
{
    /// <summary>
    /// 表示线程安全的队列
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class WorkQueue<T> : ConcurrentQueue<T>
    {
        private int _size = 100;
        private DateTime _time;
        public DateTime Time
        {
            get { return _time; }
            set { _time = value; }
        }
        public int Size
        {
            get { return _size; }
            set { _size = value; }
        }
        /// <summary>
        /// 移除并返回开始处的对象
        /// </summary>
        /// <returns></returns>
        public T TryDequeueBox()
        {
            T _obj = default(T);
            if (!this.IsEmpty)
            {
                this.TryDequeue(out _obj);
                this._time = DateTime.Now;
            }
            return _obj;
        }
        /// <summary>
        /// 将对象添加到队列末尾
        /// </summary>
        /// <param name="box"></param>
        public void EnqueueBox(T box)
        {
            if (this._size > this.Count)
            {
                this.Enqueue(box);
                _time = DateTime.Now;
            }
            else
            {
                this.Clear();
            }
        }
        /// <summary>
        /// 清空队列
        /// </summary>
        /// <returns></returns>
        public List<T> Clear()
        {
            T _obj = default(T);
            List<T> objectT = new List<T>();
            do
            {
                this.TryDequeue(out _obj);
                objectT.Add(_obj);
            } while (this.Count != 0);
            return objectT;
        }
    }
}

原文地址:https://www.cnblogs.com/aqyl/p/12389318.html

时间: 2024-08-29 18:40:22

C#异步数据处理-WorkQueue的相关文章

异步数据处理Handler

在单线程的程序当中,主线程在处理大数据或者访问网络资源,UI主线程往往会卡住,出现点不动的现象(UI线程被阻塞),这种情况下,一般 会用多线程来处事,单独开一个子线程进行数据处理,这就会遇到一个问题,子线程更新的数据如何反映到UI主线程中,这就要用到Handler,它的主要功 能是接受子线程发送的数据, 并用此数据配合主线程更新UI.具体用法也蛮简单: 1. 在子线程串发送message Message msg = new Message(); Bundle b = new Bundle();/

Boost-IO学习 异步数据处理Simple(转)

为了防止自己忘记,而记在这里的... #include <boost\asio.hpp> #include <iostream> using namespace std; void handler(const boost::system::error_code &ec) { cout << "5s" << endl; } void handler2(const boost::system::error_code &ec)

安卓异步任务AsynTask(1)

1.AsynTask类结构asysTask类主要用到的几个内部回调函数有:doInBackGround() onPreExecute() onPostExecute() onProgressUpdate()复制代码正是这几个回调函数构成了AsynTask类的使用逻辑结构.注意:每个AsynTask子类必须至少复写doInBackGround()方法.2.回调逻辑关系调用关系如下图:    1>主线程调用AsynTask子类实例的execute()方法后,首先会调用onPreExecute()方法

android异步任务图片下载(进度条提示进度)

一.AsyncTask介绍 Android提供了几种在其他线程中访问UI线程的方法. Activity.runOnUiThread( Runnable ) View.post( Runnable ) View.postDelayed( Runnable, long ) Hanlder 这些类或方法同样会使你的代码很复杂很难理解.然而当你需要实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕. 为了解决这个问题,Android 1.5提供了一个工具类:AsyncTask,它使创建需要与用户界

android异步任务详解 AsynTask

android提供了一套专门用于异步处理的类.即:AynsTask类.使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回. 其实,AsynTask类就是对Thread类的一个封装,并且加入了一些新的方法.编程时,两者都可以实现同样的功能.本文后面将对AsynTask和Thread进行比较. 1.AsynTask类结构 asysTask类主要用到的几个内部回调函数有: doInBackGround() onPreExecute() onPostExecute() onProgressUp

HTML5新特性

1.HTML5简介 在之前一直使用的是HTML 4.0标准,而且一直到现在为止,HTML4.0依然作为整个行业的最广泛的使用标准.所谓的HTML5指的就是HTML的第5.0版本,但是对于HTML 5.0标准基本上是让人觉得期待了很久.而且对于HTML5技术与传统的HTML 4最大的差别在于移动端的支持上.例如,在HTML 5之中支持了GPS的取得(可以取得当前移动端的经度和纬度两个信息),那么就可以轻松的实现定位的需要,当然,这一切的操作都必须有一个前提:浏览器要支持.到现在为止一直制约HTML

作业调度框架 Quartz.NET 2.0 StepByStep

注:目前网上诸多介绍Quartz.net的文章,甚至Quartz.net官网上的Tutorial都是1.0版本的,而这个项目在2.0版本对项目进行了比较大规模的修改,使得原有的很多例子都不能运行,故写此文.由于本人是边学边用,加之技术写作水平皆有限,错误自然难免,望轻拍,我将不定时更新完善此贴,希望能为需要的朋友提供帮助. 1. 项目介绍 现今的系统,业务数据是越来越大,传统的同步处理方式有时候已经不能满足用户需求,定时后台服务这种异步数据处理形式则逐渐被大家接受.相信大家在平时的工作中也经常遇

【转载】值得推荐的C/C++框架和库

原文:值得推荐的C/C++框架和库 值得学习的C语言开源项目 Libevent libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施.其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理.基于Reactor模式,效率较高,并且代码精简(4.15版本8000多行),是学习事件驱动编程的很好的资源. 下载链接:https://github.com/libevent/libevent Memcached Memcached 是一个高性能

Boost Asio初探

一.简介 Boost Asio ( asynchronous input and output)关注数据的异步输入输出.Boost Asio 库提供了平台无关性的异步数据处理能力(当然它也支持同步数据处理).一般的数据传输过程需要通过函数的返回值来判断数据传输是否成功,而Boost Asio将数据传输分为两个独立的步骤: 采用异步任务的方式开始数据传输. 将传输结果通知调用端 与传统方式相比,它的优势在于程序在数据传输期间不会被阻塞. 二.I/O Services 与 I/O Objects 应