c# winform 数据实时刷新问题

.Net技术 码拜 9年前 (2016-07-12) 4667次浏览
本人从雷达上获取数据,雷达的收发时间是实时的,大致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();
        }
    }
}
解决方案

40

本人不了解具体需求,也不知道数据结构和界面具体是什么样子的,也帮不了更多了。
那个原型代码估计也就是用了个ConcurrentQueue有些陌生。原因是需要一个线程安全的结构来在两个线程之间传递数据,这些Concurrent开头的结构能够保证并发读写的线程安全,这个结构的功能也可以被一个数据库替换。可以把它想象成一个数据池,一方不断往里面填数据,另一方不断从里面取数据。
然后就是UI控件不能直接绑定到这个结构上,需要隔离开才能保证UI不会对数据的生产方发生影响。所以把数据池里面的数据放到了一个专门做绑定用的BindingList里,它可以通过本人的变化直接触发UI更新,方便一点。
这个后面还需要处理内存增长的问题,和界面能一次加载多少数据的问题。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c# winform 数据实时刷新问题
喜欢 (1)
[1034331897@qq.com]
分享 (0)