我有这个脚本:
Action update = () =>
{
dataGridMaterials.DataSource = null;
dataGridMaterials.AutoGenerateColumns = false;
dataGridMaterials.DataSource = materials;
dataGridMaterials.Refresh();
};
var invoke = dataGridMaterials.BeginInvoke(update);
if (invoke != null) dataGridMaterials.EndInvoke(invoke);
材料有很多元素。
它应该重新加载DataGridView,但它没有。我所知道的是BeginInvoke没有调用该动作。
任何想法更新DataGridView的另一种方法? (.NET Framework 4)
答案 0 :(得分:2)
BeginInvoke
在“UI线程”上发布消息。一旦该线程空闲,它将接收消息并处理它。
如果您共享的代码在UI线程上运行,您也可以直接执行操作,而不是使用BeginInvoke
。
如果代码没有在UI线程上运行,那么我可以想到的没有运行操作的唯一原因是UI线程正在等待此代码完成,即:
void MyMethodCalledOnUIThread()
{
Action update = () =>
{
...
};
ManualResetEvent mre = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback((o) =>
{
dataGridMaterials.EndInvoke(dataGridMaterials.BeginInvoke(update));
mre.Set();
}), null);
mre.WaitOne();
}
这将导致UI线程和ThreadPool线程等待彼此,并且整个UI将停止响应。