本人从雷达上获取数据,雷达的收发时间是实时的,大致50ms收取一次消息,很快速.
有一些相关信息本人需要获取过来后,在一个GRID上显示,但是本人发现一个问题.就是数据实时更新的时候,例如本人点击或拖动窗体会造成卡顿或假死的情况.以下是本人模拟数据实时刷新的代码.问一下本人这种情况该怎么样考虑?使用多线程?还是?以下代码只是模拟,可能会有歧义.
有一些相关信息本人需要获取过来后,在一个GRID上显示,但是本人发现一个问题.就是数据实时更新的时候,例如本人点击或拖动窗体会造成卡顿或假死的情况.以下是本人模拟数据实时刷新的代码.问一下本人这种情况该怎么样考虑?使用多线程?还是?以下代码只是模拟,可能会有歧义.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication4 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 100000; i++) { this.dataGridView1.DataSource = getTable(i); this.dataGridView1.Refresh(); this.dataGridView1.Update(); } } public DataTable getTable(int i) { DataTable table = new DataTable(); table.Columns.Add("column1", System.Type.GetType("System.String")); table.Columns.Add("column2", System.Type.GetType("System.String")); DataRow row = table.NewRow(); row["column1"] = "AXsasas" + i; row["column2"] = "AAdasdas" + i; table.Rows.Add(row); table.AcceptChanges(); return table; } private void Form1_Load(object sender, EventArgs e) { //getTable(); //this.dataGridView1.DataSource = getTable(); } } }
解决方案
40
本人不了解具体需求,也不知道数据结构和界面具体是什么样子的,也帮不了更多了。
那个原型代码估计也就是用了个ConcurrentQueue有些陌生。原因是需要一个线程安全的结构来在两个线程之间传递数据,这些Concurrent开头的结构能够保证并发读写的线程安全,这个结构的功能也可以被一个数据库替换。可以把它想象成一个数据池,一方不断往里面填数据,另一方不断从里面取数据。
然后就是UI控件不能直接绑定到这个结构上,需要隔离开才能保证UI不会对数据的生产方发生影响。所以把数据池里面的数据放到了一个专门做绑定用的BindingList里,它可以通过本人的变化直接触发UI更新,方便一点。
这个后面还需要处理内存增长的问题,和界面能一次加载多少数据的问题。
那个原型代码估计也就是用了个ConcurrentQueue有些陌生。原因是需要一个线程安全的结构来在两个线程之间传递数据,这些Concurrent开头的结构能够保证并发读写的线程安全,这个结构的功能也可以被一个数据库替换。可以把它想象成一个数据池,一方不断往里面填数据,另一方不断从里面取数据。
然后就是UI控件不能直接绑定到这个结构上,需要隔离开才能保证UI不会对数据的生产方发生影响。所以把数据池里面的数据放到了一个专门做绑定用的BindingList里,它可以通过本人的变化直接触发UI更新,方便一点。
这个后面还需要处理内存增长的问题,和界面能一次加载多少数据的问题。