当前位置: 首页 > 编程语言 > C#

速度太快需要更新太多数据时UI无响应分享

时间:2023-04-10 22:08:36 C#

速度太快需要更新数据太多时UI无响应我做的一个控件来记录从不同线程到屏幕的消息。它使用富文本框来显示格式化文本。当每200-250毫秒有20个线程附加它们的消息时,主UI会暂时无响应,在处理消息等待后,UI会再次开始响应。线程运行时,窗口的移动不流畅。写入富文本框的消息与锁同步。您对提高性能有什么建议吗?我计划运行100个线程。这是我的代码。我将控制台输出重定向到它,它记录所有正在发生的事情,并以格式化的形式在富文本框中显示。publicvoidRedirectStandardOutput(){Console.SetOut(ConsoleStream);System.Diagnostics.Debug.Listeners.Add(新System.Diagnostics.TextWriterTraceListener(Console.Out));System.Diagnostics.Debug.AutoFlush=true;}控制台重新加载定向后所有Console.WriteLine("blabla");被写入屏幕。使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Windows.Forms;使用CoreLib.Parsers;namespaceConsoleWidget{publicclassConsoleStream:System.IO.TextWriter{privatereadonlyobject_textBoxLock=newobject();公共RichTextBox文本框{得到;放;}公共列表TextFormatList{得到;放;}publicboolAutoClear{得到;放;}publicintAutoClearLength{得到;放;}publicboolAutoSave{得到;放;}publicstringAutoSaveDir{get;放;}publicConsoleStream(){TextFormatList=newList();}publicvoidAppendText(stringtext){if(TextBox==null)return;vartextLength=TextBox.TextLength;if(AutoClear&&textLength>AutoClearLength){if(AutoSave){vardir=string.Format(@"{0}{1}{2}",Environment.CurrentDirectory,AutoSaveDir,CoreLib.Extensions.DateTimeExtensions.DateTimeNowDir);如果(!System.IO.Directory.Exists(dir))System.IO.Directory.CreateDirectory(dir);变量path=string.Format(@"{0}{1}.log",dir,CoreLib.Extensions.DateTimeExtensions.GetDateTimeNowFileName);TextBox.SaveFile(路径);}TextBox.Clear();}TextBox.AppendText(文本);//格式化文本。foreach(TextFormatList中的vartextFormat){intbeginIndex;整数长度;if(textFormat.GetFormatProperties(text,outbeginIndex,outlength)){//RichTextBox将双字符换行符“rn”计为单字符。//导致选择开始移动。下面的行计算beginIndex之前的“r”字符。varleftText=text.Substring(0,beginIndex);varnewLineCount=leftText.Count(c=>c=='r');TextBox.SelectionStart=textLength+beginIndex-newLineCount;TextBox.SelectionLength=长度;如果(!textFormat.Color.IsEmpty)TextBox.SelectionColor=textFormat.Color;如果(textFormat.Font!=null)TextBox.SelectionFont=textFormat.Font;}}TextBox.ScrollToCaret();}publicvoidClear(){lock(_textBoxLock){TextBox.Clear();}}公共int文本Length{get{lock(_textBoxLock){returnTextBox.TextLength;}}}publicvoidSaveAs(stringpath){lock(_textBoxLock){TextBox.SaveFile(path);}}publicoverrideEncodingEncoding{get{returnEncoding.Default;}}publicoverridevoidWrite(stringvalue){if(TextBox==null)return;varaction=(Action)(()=>AppendText(value));锁定(_textBoxLock){如果(TextBox.InvokeRequired)TextBox.BeginInvoke(action);否则动作();}}publicoverridevoidWriteLine(){Write(NewLine);}publicoverridevoidWriteLine(stringvalue){Write(value);写行();让你的工作线程将它们的数据添加到某种队列/列表中,然后让主线程每秒/半秒从一个新的数据存储中添加一批新数据(调整以适应你的过程)像这样基本的东西可能没问题:publicclassDataStore{privateobject_lock=newobject();私有列表_data=newList();publicvoidAdd(Tdata){lock(_lock){_data.Add(data);}}publicT[]TakeWork(){T[]结果;锁(_lock){结果=_data.ToArray();_data.Clear();}返回结果;工作线程使用Add函数添加要显示的工作,然后执行foreach(varsin_dataStore.TakeWork()){richTextBox.AppendText(s);}在System.Windows.Forms.Timer事件中。您可能还想修剪RichTextBox文本,但如果您整天都在抽取数据,您的应用程序将开始变慢......让它们写入缓冲区RichTextBox(实际上不是表单的一部分),并且每250msLeft和right只将缓冲区附加到UIRichTextBox。也许您可以尝试使用线程池或任务来更好地管理线程。以上是C#学习教程:当速度太快,需要更新的数据太多时,UI无响应。分享的所有内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: