我正在编写一个应用程序,它将以高达250kb / sec的速率显示串行/ USB数据 。 我正在使用.net SerialPort类和对DataReceived
事件作出反应。 对于这个软件的早期实现,我只是将传入的数据存储在WinForms RichTextBox
。 这个解决scheme工作正常,直到控制中有50k-10万行 ,此时应用程序陷入困境。 从那以后,我试着用WPF来实现我的目标,并发现了同样的问题。 我曾试着只保留文本框中当前可见的文本,并将其余的保存在一个大的List<string>
但是这个解决scheme需要大量的解决方法,最后被放弃了 – 我想而不是重新发明轮子 。
现在我来找你一个希望 – 我愿意尝试任何东西 ! 我应该使用自定义控件 (欢迎使用付费和免费控件)? SQLite ? 如上所述的虚拟化 ? 我应该尝试轮询SerialPort而不是对事件做出反应吗?
使用线程读取数据并直接写入文件。 让您的应用程序每隔一段时间刷新文件的最后x行。 也许甚至有基于读者线程的通知刷新?
通过使用多个线程,您可以保持UI的响应,并直接写入文件,确保您已经收集了所有的数据。 此外,它将允许您暂停显示足够长的时间,以便在继续捕获数据的同时实际复制/粘贴所需的数据。
可能你可以实现你自己的文件阅读器类型,它允许用户一次只加载你实际显示在屏幕上的部分来滚动文件。
如果数据主要是面向行的(ReadLine),那么把它放在ListBox中。 这是在屏幕上放置大量文字的最快控制。
但是你会发现,所有的用户界面控件都是面向人类交互的,而不是端口的速度。 最好的办法是重新考虑你的设计。 这是什么数据呢?