c# richtextbox更新大量數(shù)據(jù)不卡死的實現(xiàn)方式
前言
c# 的richtextbox對讀入幾十萬行大數(shù)據(jù)或者頻繁更新經(jīng)常卡死界面幾分鐘。
終于找到一個通過子線程更新的方法, 實際測試對于40萬行可以在10秒內(nèi)完成更新, 并且運行中界面不卡死可以操作。
一、richtextbox更新方法
richtextbox更新有兩種更新方法:
richtextbox.appendtext() 和 richtextbox.text = richtextbox.text + str。
在子線程中可使用 richtextbox.text = richtextbox.text + str。
為了提高效率, 使用了StringBuilder sb進行緩沖, 每maxDisplayline行更新一次richtextbox, 并根據(jù)行數(shù)增加動態(tài)調(diào)整了maxDisplayline的大小。
二、使用步驟
代碼如下(核心代碼):
maxDisplayline = 1 * 1000; // 1000行 StringBuilder sb = new StringBuilder(); Stopwatch swGlobal = new Stopwatch(); string[] sblineslist = in_str.Split(new char[] { '\n' }); // instr 為輸入字符串,可以是文件讀入的 // static readonly object lockSb = new object(); richTextBoxDisplay.Focus(); sb.Clear(); Thread.Sleep(1); swGlobal.Reset(); swGlobal.Start(); Thread t = new Thread((ThreadStart)delegate { try { for (int i = 0; i < sblineslist.Length; i++) { if (stopSign) { return; } // lock(lockSb) sb.Append(sblineslist[i] + "\n"); if (i > 0 && i % maxDisplayline == 0) { this.Invoke((EventHandler)delegate { labelStatus.Text = "狀態(tài): " + count + "/" + manualSyncFilesFullname.Count + " " + runsecond + "s -> " + (i + 1) + " Act/Rest: " + swGlobal.ElapsedMilliseconds/1000 + "/" + (int)(1.0 * swGlobal.ElapsedMilliseconds * (sblineslist.Length - (i+1)) /(i+1) /1000) + "s"; labelStatus.Update(); }); if (sb.Length > 0) { // lock(lockSb) this.richTextBoxDisplay.Text = this.richTextBoxDisplay.Text + sb.ToString(); sb.Clear(); } maxDisplayline = maxDisplayline * ((int)Math.Sqrt(i/ maxDisplayline)); } } if (sb.Length > 0) { // lock(lockSb) this.richTextBoxDisplay.Text = this.richTextBoxDisplay.Text + sb.ToString(); sb.Clear(); } this.Invoke((EventHandler)delegate { labelStatus.Text = "狀態(tài): " + count + "/" + manualSyncFilesFullname.Count + " " + runsecond + "s -> " + sblineslist.Length.ToString() +" Act: " + swGlobal.ElapsedMilliseconds / 1000 + "s"; labelStatus.Update(); }); } catch (Exception ex) { try { stopSign = true; this.Invoke((EventHandler)delegate { labelStatus.Text = "異常錯誤: " + ex.Message; labelStatus.Update(); }); } catch { } } }); t.IsBackground = true; t.Start(); Thread.Sleep(33); while (!stopSign && t != null && t.IsAlive) { Application.DoEvents(); Thread.Sleep(3); }
總結(jié)
richtextbox.text 支持在子線程中直接操作和訪問。
如果需要多線程并發(fā)交互更新,需要在操作sb的時候加鎖。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
c#數(shù)據(jù)綁定之向查詢中添加參數(shù)(.Net連接外部數(shù)據(jù)庫)
本實例主要練習了ADO.Net連接到外部數(shù)據(jù)庫的基礎(chǔ)上,向查詢中添加參數(shù)。使用的是ACCESS數(shù)據(jù)庫2014-04-04C#操作DataGridView獲取或設(shè)置當前單元格的內(nèi)容
這篇文章介紹了C#操作DataGridView獲取或設(shè)置當前單元格的內(nèi)容,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則的示例詳解
在面向?qū)ο缶幊讨?,SOLID?是五個設(shè)計原則的首字母縮寫,旨在使軟件設(shè)計更易于理解、靈活和可維護。本文將通過實例詳細講講C#面向?qū)ο缶幊讨幸蕾嚪崔D(zhuǎn)原則,需要的可以參考一下2022-07-07