我有一些数据,我在一个任务中更新它:该应用程序目前是一个黑客攻击,因此对代码表示道歉。
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 ......)
我查看了 Horrible redraw performance of the DataGridView on one of my two screens
在调试下,这根本不闪烁,甚至没有闪烁......在发布条件下,有一个荒谬的闪烁......
我该怎么办?
答案 0 :(得分:2)
启动在后台填充数据集的任务,完成此任务后,执行BeginInvoke,暂停布局,分配数据并恢复。
使用现在的版本,在执行代码路径时很多可能性很难预测会发生什么。
渲染必须在UI线程上,所以你要做的就是尝试为它优化代码。而Async部分我会按照帖子开头的描述进行。
答案 1 :(得分: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();