1

我有一些数据,我在一个任务中更新它:该应用程序目前是一个黑客的想法,因此为代码道歉。

Task.Factory.StartNew(() =>
    {
        dataGridView1.BeginInvoke((Action)(() =>
            {
                dataGridView1.SuspendLayout();
            }));

        dataSet1.Reset();
        da.Fill(dataSet1);

        dataGridView1.BeginInvoke((Action)(() =>
            {
                dataGridView1.DataSource = dataSet1.Tables[0];
                dataGridView1.Columns[0].Visible = false;
                dataGridView1.Columns[1].Width = 50;
                dataGridView1.ResumeLayout();
            }));
    }
    ).ContinueWith(task =>
        {
            if (dataSet1.Tables[0].Rows.Count > 0)
            {
                if (lastcount != dataSet1.Tables[0].Rows.Count)
                {
                    lastcount = dataSet1.Tables[0].Rows.Count;
                    if (lastcount == 0)
                    {
                        NotifyWithMessage("The items have been cleared", "Items cleared");
                    }
                    else
                    {
                        NotifyWithMessage(String.Format("There are {0} new items in your monitor", dataSet1.Tables[0].Rows.Count));
                    }
                }
            }
        }
    );

现在,代码基本上可以工作了。没有错误,这很好..

当它在任务之外更新时,datavgridview 根本没有闪烁,当我在调试中运行它时,它非常小,并且在黑客可以接受的范围内..当我在调试之外运行它的那一刻......非常明显!暂停和恢复布局根本没有任何区别。我需要线程中的代码,因为 UI 在没有响应的情况下是块状的 - 虽然它是可以接受的,但现在它的刷新很糟糕。

我的 Datagridview 是根据单元格颜色自定义颜色的,但是,我只是不明白为什么调试和发布之间存在差异,我希望性能反过来!

(我试过 Invoke 和 BeginInvoke ......)

我在两个屏幕之一上查看了 DataGridView 的可怕重绘性能

而在debug下,这个根本不闪烁,甚至一点点都没有……在release条件下,有一个可笑的闪烁……

我能做些什么?

4

2 回答 2

2

启动一项在后台填充数据集的任务,完成此任务后,您将执行 BeginInvoke,在其中暂停布局、分配数据并恢复。

使用您现在拥有的版本,执行代码路径的可能性非常多,很难预测会发生什么。

渲染必须在 UI 线程上,所以你所能做的就是尝试优化它的代码。我会按照文章开头所述执行异步部分。

于 2012-06-22T12:45:54.903 回答
1

最后我做了什么:我将查询重新放入一个新的数据集中,如果计数相同,那么我没有更新网格,如果计数发生了变化,我做了。

timer1.Stop();

        Task<Boolean>.Factory.StartNew(() =>
            {
                DataSet t = new DataSet();
                //_dataSet1.Reset();
                Boolean ok = false;
                Int16 retries = 0;
                while (!ok && retries<3)
                try
                {
                    da.Fill(t);
                    ok = true;
                }
                catch
                {
                    retries++;
                    Thread.Sleep(1000);
                }
                //if (!ok) throw new Exception("DB error");
                if (!ok) return false;
                try
                {
                    if (t.Tables.Count > 0 && t.Tables[0].Rows.Count != _lastcount)
                    {
                        _dataSet1 = t;
                        _lastcount = t.Tables[0].Rows.Count;
                        return true;
                    }
                }
                catch {  }
                return false;
            }).ContinueWith(task =>
                {
                    if (task.IsFaulted)
                    {
                        SQLFailed();
                        return;
                    }
                    if (!task.Result) return;


                    Invoke((Action) (() =>
                                         {
                                             dataGridView1.DataSource = _dataSet1.Tables[0];
                                             dataGridView1.Columns[0].Visible = false;
                                             dataGridView1.Columns[1].Width = 50;
                                         }));

                    if (_lastcount == 0)
                    {
                        NotifyWithMessage("The items have been cleared", "Items cleared");
                    }
                    else
                    {
                        NotifyWithMessage(String.Format("There are {0} new items in your monitor", _lastcount));
                    }
                });


    timer1.Start();
于 2012-09-19T13:47:27.647 回答