c# winform DataGridView 数据实时刷新问题

li_tao91 2017-05-26 07:11:30
流程说明:1、通过WndProc(ref Message m)方法接收行情数据,接收到行情数据将数据填充到一个HashTable中。2、启动一个线程将HashTable中的数据处理到DataTable中,填充数据到DataTable中后会触发绑定数据源的方法,去加载DataGridView的数据。现在问题是:Debug运行的时候能跑起来,但是不Debug运行的时候,加载一次数据就卡死(加载了滚动条,不知道是卡死还是假死)(数据大概5000条),请大牛帮忙看看,在此,先谢谢了!!。
代码:

StockDrv.CS:
启动线程:
public StockDrv()
{
InitDTColumns();
Thread t = new Thread(new ThreadStart(FullDataSource));
t.Start();
}

/// <summary>
/// 填充数据源
/// </summary>
private void FullDataSource()
{
tagRCV_REPORT_STRUCTEx quote;
bool flag = false;
while (true)
{
if (QuoteCache.Count > 0)
{
ArrayList keys=null;
try
{
lock (QuoteCache)
{
keys = new ArrayList(QuoteCache.Keys);
}
}
catch (Exception e)
{
keys = new ArrayList();
}
try
{
for (int i = 0; i < keys.Count; i++)
{
quote = (tagRCV_REPORT_STRUCTEx)QuoteCache[keys[i]];
//判断当前行情是否已存在数据源中
DataRow[] rows = datasource.Select("m_szLabel='" + quote.m_szLabel + "'");
if (rows.Length > 0)
{
//判断数据是否已更新
if (Convert.ToSingle(rows[0]["m_fVolume"]) < quote.m_fVolume ||
(Convert.ToSingle(rows[0]["m_fVolume"]) == quote.m_fVolume
&& Convert.ToSingle(rows[0]["m_fNewPrice"]) != quote.m_fNewPrice))
{
DateTime dt = new DateTime(1970, 1, 1);
dt = dt.AddSeconds(quote.m_time);
dt = dt.AddHours(8);
string strTime = dt.ToString("yyyy-MM-dd HH:mm:ss");

rows[0].BeginEdit();
rows[0]["m_cbSize"] = quote.m_cbSize;
rows[0]["m_time"] = strTime;
rows[0]["m_wMarket"] = quote.m_wMarket;
rows[0]["m_szName"] = quote.m_szName;
rows[0]["m_fLastClose"] = quote.m_fLastClose;
rows[0]["m_fOpen"] = quote.m_fOpen;
rows[0]["m_fHigh"] = quote.m_fHigh;
rows[0]["m_fLow"] = quote.m_fLow;
rows[0]["m_fNewPrice"] = quote.m_fNewPrice;
rows[0]["m_fVolume"] = quote.m_fVolume;
rows[0]["m_fAmount"] = quote.m_fAmount;
rows[0].EndEdit();
flag = true;
}
else {
flag = false;
}
}
else
{
DataRow row1 = datasource.NewRow();
DateTime dt = new DateTime(1970, 1, 1);
dt = dt.AddSeconds(quote.m_time);
dt = dt.AddHours(8);
string strTime = dt.ToString("yyyyMMdd HH:mm:ss");

row1.BeginEdit();
row1["m_cbSize"] = quote.m_cbSize;
row1["m_time"] = strTime;
row1["m_wMarket"] = quote.m_wMarket;
row1["m_szLabel"] = quote.m_szLabel;
row1["m_szName"] = quote.m_szName;
row1["m_fLastClose"] = quote.m_fLastClose;
row1["m_fOpen"] = quote.m_fOpen;
row1["m_fHigh"] = quote.m_fHigh;
row1["m_fLow"] = quote.m_fLow;
row1["m_fNewPrice"] = quote.m_fNewPrice;
row1["m_fVolume"] = quote.m_fVolume;
row1["m_fAmount"] = quote.m_fAmount;
row1.EndEdit();
datasource.Rows.Add(row1);
flag = true;
}
}
if (flag)
{
TSQuoteEventArgs e = new TSQuoteEventArgs(datasource);
OnQuote(this, e);
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
}
Form1.CS:
public void fTSdrv_OnQuote(Object sender, TSQuoteEventArgs e)
{
dataGridView1.DataSource = e.dtSuorce;
}

...全文
2795 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
redfox6843 2020-02-18
  • 打赏
  • 举报
回复
这个不会出现内存溢出吗?
li_tao91 2017-05-31
  • 打赏
  • 举报
回复
谢谢各位。 添加了sleep还是没什么用,就阻塞那点时间是好的,一过又卡死了。
by_封爱 版主 2017-05-27
  • 打赏
  • 举报
回复
你这代码还不如用timer呢.....
ilikeff8 2017-05-26
  • 打赏
  • 举报
回复
至少写个 Thread.Sleep(0); 就是最高速填充,一个中断给界面线程有机会相应,但可能鼠标操作会有点小卡
ilikeff8 2017-05-26
  • 打赏
  • 举报
回复
一直修改datasource会造成界面不停刷新

    public partial class Form1 : Form
    {
        public BindingList<Info> InfoList { get; set; }

        public Form1()
        {
            InitializeComponent();
            this.Load += Form1_Load;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            InfoList = new BindingList<Info>();
            dataGridView1.DataSource = InfoList;
            dataGridView1.ReadOnly = true;
            dataGridView1.AllowUserToAddRows = false;

            ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
            {
               while (true)
                {
                    Thread.Sleep(100);

                    dataGridView1.Invoke(new Action(() =>
                    {
                        InfoList.Add(new Info
                        {
                            A = DateTime.Now.ToString()
                        });

                        dataGridView1.Refresh();
                    }));                    
                }
            }));
        }

        public class Info
        {
           public string A { get; set; }
        }
    }
这个时候就看出来wpf比较好用了
xuggzu 2017-05-26
  • 打赏
  • 举报
回复
。。。死循环还能不卡才怪。中间插入sleep试试,但你的数据不少,如果刷新太快,估计界面可能会闪烁。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧