C# - 多线程 - InvokeRequired - 奇怪的行为?
C# - Multithreading - InvokeRequired - Strange behaviour?
我有一个关于应用程序中多线程的问题。
我有 2 种形式 - 一种 mainForm 和一种 editForm。 editForm 由 mainForm 根据用户请求调用。
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,datagrid 的数据总是被加载。
但是,如果我在不使用 Visual Studio 调试模式的情况下从调试文件夹启动解决方案的 EXE 文件,则只有在我第一次打开它时才会填充 editForm 的数据网格。下一次数据网格总是空的。我发现,这种行为是由 InvokeRequired 属性 引起的。我第一次打开 editForm 时它是 InvokeRequired = true,但是如果我关闭表单并重新打开它,它总是 false。但为什么?
当表单关闭时,我处理表单。
private void EditForm_FormClosed(object sender, FormClosedEventArgs e)
{
this.Dispose();
}
为什么在重新打开 editForm 时 InvokeRequired 总是 false?
有人可以帮忙吗?
这是 handleCreated 的问题。
我将我的线程启动代码放入我的 editForm 的表单加载(显示)事件中,然后它起作用了。
感谢您的帮助。
我有一个关于应用程序中多线程的问题。 我有 2 种形式 - 一种 mainForm 和一种 editForm。 editForm 由 mainForm 根据用户请求调用。 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,datagrid 的数据总是被加载。 但是,如果我在不使用 Visual Studio 调试模式的情况下从调试文件夹启动解决方案的 EXE 文件,则只有在我第一次打开它时才会填充 editForm 的数据网格。下一次数据网格总是空的。我发现,这种行为是由 InvokeRequired 属性 引起的。我第一次打开 editForm 时它是 InvokeRequired = true,但是如果我关闭表单并重新打开它,它总是 false。但为什么? 当表单关闭时,我处理表单。
private void EditForm_FormClosed(object sender, FormClosedEventArgs e)
{
this.Dispose();
}
为什么在重新打开 editForm 时 InvokeRequired 总是 false? 有人可以帮忙吗?
这是 handleCreated 的问题。 我将我的线程启动代码放入我的 editForm 的表单加载(显示)事件中,然后它起作用了。 感谢您的帮助。