BeginInvoke不会触发

时间:2016-12-23 15:32:15

标签: c# .net

我有这个脚本:

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)

1 个答案:

答案 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将停止响应。