问题描述
本人刚学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的,否则不如单线程完成,如果是多线程首先你必须计算你当前的线程总数计算每条线程所需要负责的“缓冲块”大小包括起始索引将所有都部署完毕才开始进行多线分布式缓冲区读写。