C#多线程实现缓冲区读写操作

问题描述

本人刚学C#,怕接收到大量的数据来不及显示,想建立一个缓冲区,一边把数据读进缓冲区,一边让缓冲区的数据显示并保存起来,希望高手指点,在此多谢!

解决方案

解决方案二:
先看线程及其互斥同步的资料
解决方案三:
所谓缓冲区,完全可以是这样一个东西:List<byte>
解决方案四:
ImportsSystem.Collections.ConcurrentImportsSystem.ThreadingImportsSystem.ComponentModelImportsSystem.Reflection'''<summary>'''用于多线程下存取对象。'''MSTOP'''2011.5.6'''</summary>'''<remarks></remarks><DefaultMemberAttribute("Value")>PublicClassMyObjBox(OfT)#Region"声明/变量"<Browsable(False),EditorBrowsable(EditorBrowsableState.Never),DebuggerBrowsable(CType(False,DebuggerBrowsableState))>PrivateObjBoxAsNewConcurrentDictionary(OfString,T)(8,50)#EndRegion#Region"接口"'''<summary>'''读盒子所有值的KEY.'''</summary>'''<value></value>'''<returns></returns>'''<remarks></remarks>PublicReadOnlyPropertyKeysAsString()GetDimKeyArry()AsString=ObjBox.Keys().ToArrayReturnKeyArryEndGetEndPropertyPublicFunctionContainsKey(KeyAsString)AsBooleanKey=Key.ToUpperReturnObjBox.ContainsKey(Key)EndFunction'''<summary>'''移除一个值.'''</summary>'''<paramname="Key"></param>'''<returns></returns>'''<remarks></remarks>PublicFunctionRemoveKey(KeyAsString)AsBooleanDimReturnBlnAsBoolean=FalseDimValAsT=NothingDimNextIDAsInt32=0DimEndIDAsInt32=200DimRandomAsInt32TryNextControl:IfObjBox.ContainsKey(Key)ThenIfNotObjBox.TryRemove(Key,Val)ThenRandom=(1+Asc(Guid.NewGuid.ToString("N"))Mod50)Windows.Forms.Application.DoEvents()Thread.Sleep(Random)NextID+=1IfNextID<EndIDThenGoToNextControlElseReturnBln=FalseGoToEndFunctionEndIfElse'//TryRemove成功ReturnBln=TrueGoToEndFunctionEndIfElseReturnBln=FalseGoToEndFunctionEndIfCatchReturnBln=FalseGoToEndFunctionEndTryEndFunction:ReturnReturnBlnEndFunction'''<summary>'''清空.'''</summary>'''<remarks></remarks>PublicSubClear()ObjBox.Clear()EndSubPublicFunctionCount()AsInt32ReturnObjBox.CountEndFunction'''<summary>'''根据Key对盒子赋值/取值.(赋值时Key如果不存在,会新增,如果存在,则覆盖。)'''</summary>'''<paramname="Key"></param>'''<value>不能是NULL,NOTHING,"",""等空或非初始化的对象。</value>'''<returns></returns>'''<remarks></remarks>PublicPropertyValue(KeyAsString)AsTSet(valueAsT)IfvalueIsNothingThenExitPropertyKey=Key.ToUpperCallAdd(Key,value)EndSetGetKey=Key.ToUpperReturnGetValue(Key)EndGetEndProperty#EndRegion#Region"操作"'''<summary>'''读'''</summary>'''<paramname="Key"></param>'''<returns></returns>'''<remarks></remarks><Browsable(False),EditorBrowsable(EditorBrowsableState.Never)>PrivateFunctionGetValue(KeyAsString)AsTDimReturnObjAsT=NothingDimNextIDAsInt32=0DimEndIDAsInt32=200DimRandomAsInt32TryNextControl:IfObjBox.ContainsKey(Key)ThenIfNotObjBox.TryGetValue(Key,ReturnObj)ThenRandom=(1+Asc(Guid.NewGuid.ToString("N"))Mod50)Windows.Forms.Application.DoEvents()Thread.Sleep(Random)NextID+=1IfNextID<EndIDThenGoToNextControlElseReturnObj=NothingGoToEndFunctionEndIfElse'//TryGetValue得到了ReturnValGoToEndFunctionEndIfElseReturnObj=NothingGoToEndFunctionEndIfCatchReturnObj=NothingGoToEndFunctionEndTryEndFunction:ReturnReturnObjEndFunction'''<summary>'''添加'''</summary>'''<paramname="Key"></param>'''<paramname="obj"></param>'''<returns></returns>'''<remarks></remarks><Browsable(False),EditorBrowsable(EditorBrowsableState.Never)>PrivateFunctionAdd(KeyAsString,ObjAsT)AsBooleanIf(KeyIsNothing)OrElse(ObjIsNothing)ThenReturnFalseDimReturnValAsBoolean=FalseDimNextIDAsInt32=0DimEndIDAsInt32=200DimRandomAsInt32DimvObjAsT=NothingDimLAAsNewLazy(OfT)(Function()Obj,True)TryNextControl:vObj=ObjBox.AddOrUpdate(Key,Obj,Function()ReturnLA.ValueEndFunction)If(vObjIsNothing)ThenRandom=(1+Asc(Guid.NewGuid.ToString("N"))Mod50)Windows.Forms.Application.DoEvents()Thread.Sleep(Random)NextID+=1IfNextID<EndIDThenGoToNextControlElseReturnVal=FalseGoToEndFunctionEndIfElseReturnVal=TrueGoToEndFunctionEndIfCatchReturnVal=FalseGoToEndFunctionEndTryEndFunction:ReturnReturnValEndFunction'''<summary>'''移除'''</summary>'''<paramname="Key"></param>'''<returns></returns>'''<remarks></remarks>PublicFunctionRemove(KeyAsString)AsBooleanDimReturnValAsBoolean=FalseDimNextIDAsInt32=0DimEndIDAsInt32=200DimRandomAsInt32TryNextControl:IfObjBox.ContainsKey(Key)ThenIfNotObjBox.TryRemove(Key,Nothing)ThenRandom=(1+Asc(Guid.NewGuid.ToString("N"))Mod50)Windows.Forms.Application.DoEvents()Thread.Sleep(Random)NextID+=1IfNextID<EndIDThenGoToNextControlElseReturnVal=FalseGoToEndFunctionEndIfElseReturnVal=TrueGoToEndFunctionEndIfElseReturnVal=TrueGoToEndFunctionEndIfCatchReturnVal=FalseGoToEndFunctionEndTryEndFunction:ReturnReturnValEndFunction#EndRegionEndClass

解决方案五:
有点复杂,看不懂呀
解决方案六:
需要显示就不需要担心来不来得急的问题。显示只管现实最新的数据,不用缓存。做统计需要数据准确,这时需要避免UI线程对主线程的占用,保证IO数据不丢失,这时一般用双进程。
解决方案七:
用Cache.Add方法将数据信息加入到缓存中//将数据项目加入缓存protectedvoidbtnAddCache_Click(objectsender,EventArgse){//利用Cache.Add()方法将数据加入缓存Cache.Add("Name",txtUserName.Text,null,System.Web.Caching.Cache.NoAbsoluteExpiration,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.CacheItemPriority.Default,null);Cache.Add("Photo",txtTel.Text,null,System.Web.Caching.Cache.NoAbsoluteExpiration,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.CacheItemPriority.Default,null);Cache.Add("Position",txtJob.Text,null,System.Web.Caching.Cache.NoAbsoluteExpiration,System.Web.Caching.Cache.NoSlidingExpiration,System.Web.Caching.CacheItemPriority.Default,null);txtMsg.Text="缓存加入成功!";}//显示缓存数据protectedvoidbtnDisplayCache_Click(objectsender,EventArgse){IDictionaryEnumeratorCacheIDE=Cache.GetEnumerator();//显示缓存数据inti=0;stringinfo=null;info+="缓存项目数据(Key/Value):"+"<br>";while(CacheIDE.MoveNext())//循环输出缓存项目{info+=i.ToString()+".";info+=CacheIDE.Key.ToString()+":";info+=CacheIDE.Value.ToString()+"<br>";i++;}if(Cache["Name"]==null)//判断缓存是否有数据项目{txtMsg.Text="缓存内容为Null值!";}else{txtMsg.Text=info;}}
解决方案八:
每次删除以及添加缓冲区数据时候Lock()就行了。
解决方案九:

解决方案十:
显示用定时器去取..将最新数据复制到一个复本中.显示从复本中读.比如0.1秒一次而缓存则将最新的数据复制到复本.然后进行数据保存即可.过程可以是无锁的
解决方案十一:
使用lock算是保险操作,但针对多线程对“缓冲池”进行控制,肯定是不可以lock的,否则不如单线程完成,如果是多线程首先你必须计算你当前的线程总数计算每条线程所需要负责的“缓冲块”大小包括起始索引将所有都部署完毕才开始进行多线分布式缓冲区读写。

时间: 2024-11-03 22:49:36

C#多线程实现缓冲区读写操作的相关文章

PHP文件读写操作之文件读取方法详解_php技巧

PHP文件读取操作相对于文件写入操作涉及更多的PHP文件操作函数,在代码实例中会详细介绍这些函数. 读取文本文件中存储数据的方式主要涉及的三个步骤及部分文件操作函数如下: 1.打开文件(文件操作函数:fopen) 2.文件数据读取(文件操作函数:fgets.file.readfile.feof等) 3.关闭文件(文件操作函数:fclose) 下面仍然以PHP文件读写操作代码实例讲解文件读取方法的具体应用,在实例中,通过调用不同的PHP文件读取操作函数读取文本文件中的数据,你可以加深PHP文件读取

python文件读写操作简单程序代码

例子 python写文件  代码如下 复制代码 object_id_list=[1, 3, 88, 99] f=open('mylist', "w") for id in object_id_list:     f.writelines(str(id)) f.close()   #只有输入这一句之后才会真正写入到文件中 cat mylist 138899%   # 最后有一个%表示没有换行 >>> object_id_list=[1, 3, 88, 99] >&

java中IO操作 利用文件流 过滤流对文件进行读写操作

/* 两种基本的流是:输入流(Input Stream)和输出流(Output Stream) .可从中读出一系列字节的对象称为输入流. 而能向其中写入一系列字节的对象称为输出流. System.out.println   中的 out 是 PrintStream 类对象   System类的静态成员可以向 输出流写入数据 System.in.read()     in 是InputStream类的成员 可以从键盘等输入设备读取字节数据  利用FileInputStream   FileOutp

Java 中对文件的读写操作之比较

比较 Java 中对文件的读写操作之比较 作者:Jeru Liu日期:November 29,2000版本:1.0 Java 对文件进行读写操作的例子很多,让初学者感到十分困惑,我觉得有必要将各种方法进行一次分析,归类,理清不同方法之间的异同点. 一.在 JDK 1.0 中,通常是用 InputStream & OutputStream 这两个基类来进行读写操作的.InputStream 中的 FileInputStream 类似一个文件句柄,通过它来对文件进行操作,类似的,在 OutputSt

Java中对文件的读写操作之比较

比较 Java 中对文件的读写操作之比较 Java 对文件进行读写操作的例子很多,让初学者感到十分困惑,我觉得有必要将各种方法进行 一次分析,归类,理清不同方法之间的异同点. 一.在 JDK 1.0 中,通常是用 InputStream & OutputStream 这两个基类来进行读写操作的. InputStream 中的 FileInputStream 类似一个文件句柄,通过它来对文件进行操作,类似的,在 OutputStream 中我们有 FileOutputStream 这个对象. 用F

PHP文件读写操作之文件写入教程

在PHP网站开发中,存储数据通常有两种方式,一种以文本文件方式存储,比如txt文件,一种是以数据库方式存储,比如Mysql,相对于数据库存储,文件存储并没有什么优势,但是文件读写操作在基本的PHP开发中还是时有使用,今天和大家分享如何利用PHP技术实现文件读写之文件写入操作教程,也算是对PHP文件读写操作的入门学习. 将数据写入文件的操作主要涉及三个步骤及部分文件操作函数如下: 1.打开文件(文件操作函数:fopen) 2.写入文件(文件操作函数:fwrite等) 3.关闭文件(文件操作函数:f

c语言文件读写操作的问题

问题描述 c语言文件读写操作的问题 文件读写函数可以读写什么样类型的文件,有什么具体的实际的用途?它可以访问任意文件吗 解决方案 是的,可以访问任何文件,除非权限不足的文件无法访问.另外16bit环境下的C库函数(turbo c)不能访问2GB以上的大文件. 对于二进制文件,读取和解析是两个不同的概念.好比你只要视力没问题,你可以看任何语言写的书,但是显然外语的书你不一定看得懂. 你可以读取一个word文档文件,用C,得到一串字节,但是要想知道这个word文档中的文章.表格是什么,就复杂的多.

AngularJS入门教程之Cookies读写操作示例_AngularJS

本文实例讲述了AngularJS的Cookies读写操作.分享给大家供大家参考,具体如下: 虽然使用JavaScript创建和获取Cookie很简单,AngularJS还是把它作为一个单独的模块进行了封装,模块名为ngCookies,和前面的教程中做法一样,先引入angular-cookies.js: <script type="text/javascript" src="angular-1.3.0.14/angular-cookies.js"><

python文件读写操作与linux shell变量命令交互执行的方法_python

本文实例讲述了python文件读写操作与linux shell变量命令交互执行的方法.分享给大家供大家参考.具体如下: python对文件的读写还是挺方便的,与linux shell的交互变量需要转换一下才能用,这比较头疼. 代码如下: 复制代码 代码如下: #coding=utf-8 #!/usr/bin/python import os import time #python执行linux命令 os.system(':>./aa.py') #人机交互输入 S = raw_input("