C# - 多线程 - InvokeRequired - 奇怪的行为?

时间:2015-03-31 12:47:36

标签: c# multithreading datagrid

我在应用程序中遇到了有关多线程的问题。 我有两个表单 - 一个mainForm和一个editForm。 editForm由mainForm根据用户请求调用。 editForm实现了一个datagrid,应该由一个线程填充。 我这样做了:

    try
{
                InitializeComponent();
                Thread loadingDatagridThread = new Thread(new ThreadStart(() =>
                {
                                this.LoadDataGrid();
                }));
                loadingDatagridThread.Name = "LoadingDatagridThread";
                loadingDatagridThread.Start();
}
catch (Exception exp)
{
                throw exp;
}

“LoadDataGrid”方法如下所示:

private void LoadDataGrid()
{
                try
                {
                                this.picBox_Loading.Visible = true;
                                if (this.InvokeRequired == true)
                                {
                                                this.HaulierList = new Classes.HaulierCollection(Classes.HaulierCollectionKind.ByStopFlag, new object[] { 0 });
                                                this.BeginInvoke(new LoadDataGridDelegate(this.LoadDataGrid));
                                                return;
                                }
                                else
                                {
                                 //Fill the grid
                                }
                }
}

正在线程中加载datagrid(HaulierCollection)的集合。当InvokeRequired为false时,在主线程中填充数据网格。 如果我在Visual Studio中工作并在调试模式下测试它,则此方案可以正常工作。 我可以关闭并重新打开editForm,并始终加载datagrid的数据。 但是如果我在不使用Visual Studio调试模式的情况下从调试文件夹启动解决方案的EXE文件,则只在我第一次打开它时才会填充editForm的数据网格。下一次datagrid始终为空。我发现,这种行为是由InvokeRequired属性引起的。我第一次打开editForm时它是InvokeRequired = true,但如果我关闭表单并重新打开它,它总是假的。但为什么? 当表格关闭时,我会处理表格。

private void EditForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Dispose();
    }

为什么在重新打开editForm时InvokeRequired总是为false? 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:-1)

这是handleCreated问题。 我将我的线程启动代码放入我的editForm的表单加载(显示)事件中然后它工作。 谢谢你的帮助。