【发布时间】:2015-03-31 12:47:35
【问题描述】:
我有一个关于应用程序中的多线程的问题。 我有 2 个表格 - 一个 mainForm 和一个 editForm。主窗体根据用户请求调用editForm。 editForm 实现了一个数据网格,它应该由一个线程填充。 我是这样做的:
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
}
}
}
数据网格 (HaulierCollection) 的集合在线程中时正在加载。然后,当 InvokeRequired 为 false 时,在主线程中填充数据网格。 如果我在 Visual Studio 中工作并在调试模式下对其进行测试,则此方案工作正常。 我可以关闭并重新打开editForm,并且始终加载数据网格的数据。 但是,如果我在不使用 Visual Studio 调试模式的情况下从调试文件夹启动解决方案的 EXE 文件,则只有在我第一次打开它时才会填充 editForm 的数据网格。下一次数据网格总是空的。我发现,这种行为是由 InvokeRequired 属性引起的。我第一次打开 editForm 时它是 InvokeRequired = true,但如果我关闭表单并重新打开它,它总是错误的。但为什么? 当表单关闭时,我会处理表单。
private void EditForm_FormClosed(object sender, FormClosedEventArgs e)
{
this.Dispose();
}
为什么在重新打开 editForm 时 InvokeRequired 总是为假? 有人可以帮忙吗?
【问题讨论】:
-
如何打开新表单?你使用 using 指令吗?
-
我只是创建了一个新的表单实例,然后执行 showDialog(): private void haulierBasisDataToolStripMenuItem_Click(object sender, EventArgs e) { try { Forms.EditForm editForm = new Forms.EditForm(); editForm.ShowDialog(); } catch (Exception exp) { throw exp; } }
-
您每次创建一个新实例,您想显示一个表单?表单的变量是全局声明的?
-
是的,我每次都创建一个新实例。但这并不能回答我的问题,还是这样?我想,在表单的构造函数中创建线程,然后加载数据。为什么不第二次,第三次......时间。
-
这是标准的,AFAIK,如果处理多线程,您将面临这样的问题。查看我的链接以获取有关 IsHandleCreated 等的更多信息。
标签: c# multithreading datagrid