c# winform 数据实时刷新有关问题
c# winform 数据实时刷新问题
我从雷达上获取数据,雷达的收发时间是实时的,大概50ms收取一次消息,很快速.
有一些相关信息我需要获取过来后,在一个GRID上显示,但是我发现一个问题.就是数据实时更新的时候,比如我点击或者拖动窗体会造成卡顿或者假死的情况.以下是我模拟数据实时刷新的代码.请问我这种情况该如何考虑?使用多线程?还是?以下代码只是模拟,可能会有歧义.
------解决思路----------------------
我不了解具体需求,也不知道数据结构和界面具体是什么样子的,也帮不了更多了。
那个原型代码估计也就是用了个ConcurrentQueue有些陌生。因为需要一个线程安全的结构来在两个线程之间传递数据,这些Concurrent开头的结构能够保证并发读写的线程安全,这个结构的功能也可以被一个数据库替换。可以把它想象成一个数据池,一方不断往里面填数据,另一方不断从里面取数据。
然后就是UI控件不能直接绑定到这个结构上,需要隔离开才能保证UI不会对数据的生产方发生影响。所以把数据池里面的数据放到了一个专门做绑定用的BindingList里,它可以通过自己的变化直接触发UI更新,方便一点。
这个后面还需要处理内存增长的问题,和界面能一次加载多少数据的问题。
我从雷达上获取数据,雷达的收发时间是实时的,大概50ms收取一次消息,很快速.
有一些相关信息我需要获取过来后,在一个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();
}
}
}
------解决思路----------------------
我不了解具体需求,也不知道数据结构和界面具体是什么样子的,也帮不了更多了。
那个原型代码估计也就是用了个ConcurrentQueue有些陌生。因为需要一个线程安全的结构来在两个线程之间传递数据,这些Concurrent开头的结构能够保证并发读写的线程安全,这个结构的功能也可以被一个数据库替换。可以把它想象成一个数据池,一方不断往里面填数据,另一方不断从里面取数据。
然后就是UI控件不能直接绑定到这个结构上,需要隔离开才能保证UI不会对数据的生产方发生影响。所以把数据池里面的数据放到了一个专门做绑定用的BindingList里,它可以通过自己的变化直接触发UI更新,方便一点。
这个后面还需要处理内存增长的问题,和界面能一次加载多少数据的问题。