在winform应用程序中,我遇到以下情况:
由于我无法绑定到BindingList(它会冻结Ui线程),我决定使用Queue并根据Timer更新网格视图。当处理计时器的已用事件时,我更新了调用的计时器 gridview.TemplateMaster.Refresh()导致调用cellValueNeeded
这是我发现的最快的解决方案,但我遇到了一些问题:
你们中的任何人都有更好的方法吗? 感谢
答案 0 :(得分:0)
给出以下附加信息:
我有8列......行号取决于拖动的项目 从树视图...在这个测试用例中,我有256行,但可以更多 ...对于第二点如果我重新引导整个项目源我放松了什么 已更新
你的问题要比你的OP建议复杂得多。实际上,您有两个更改源可以修改网格和基础数据。一个来自您的传入数据包,另一个来自用户。您还有8 * 256 = 2048项向用户显示。那是很多。根据我对OP的理解,UI可以每秒更新多达1,000个新值。这不是一个有用的功能,因为没有人能够快速处理信息。
因此,鉴于用户可以从树视图中任意地将数据拉入网格,并且您的数据包接收器可以每秒添加或更新一千个网格数据单元,我建议采用一种截然不同的方法:
后人的原始答案:
我建议创建一个新的集合,它将是UI和套接字线程之间的共享资源(假设你有一个用于套接字通信的线程)。您将更新此集合以及最新更改的标记时间戳。此标志很重要,因为除非数据确实发生了变化,否则不会更改它。您还可以有一个额外的字段,可以计算自最新更改以来的更新数。 (我假设/希望这些数据中的大部分实际上并不会有所不同。)
所以现在你有一个可以被两个线程共享的内部缓存。您不必担心同步问题,因为一个线程只写,另一个只读。
答案 1 :(得分:0)