说我有以下课程/表格(半假):
public partial class X : Form
{
private DataTable dt;
private BackgroundWorker bg;
public X()
{
dt.Columns.Add("A");
dt.Columns.Add("B");
dt.Columns.Add("C");
}
private void button_Click(...)
{
bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerAsync();
}
private void bg_DoWork(...)
{
// do some stuff
MagicMethod(parameters);
// doesnt work, how to fix this?
dataGridView1.Invoke((Action)delegate { dataGridView1.DataSource = dt; });
}
private void MagicMethod(params)
{
// update a label, WORKS
label1.Invoke((Action) delegate { label1.Text = "somestuff" }
// do some stuff to fill the datatable
}
}
当然这是一个提炼版本,没有BackgroundWorker一切都是合理的,但由于我想要一个响应更快的UI,我尝试实现一个。但是网格不会被工作者更新(而标签正确)。有什么提示吗?
答案 0 :(得分:1)
您可能会在某处(可能在MagicMethod中)导致异常,并且因为您没有处理Bgw RunWorkerCompleted事件,所以您没有注意到它。
因此,添加RunWorkerCompleted事件并检查e.Error != null
完成的活动也是处理结果的方便且安全的地方:dataGridView1.DataSource = dt;
请参阅this MSDN example并注意RunWorkerCompleted事件中的if / else if / else模式。