我正在使用Visual Studio .NET 2010和C#制作一个带有Windows窗体的GUI应用程序。
我有多个线程,例如:
1. 检查目标设备是否断开连接的线程
2. 请求并接收设备测量结果的线程
3. 不断更新主窗体的线程。此线程使用Control.Invoke()调用主窗体控件的更改。
我的目标:当用户在主窗体上按(x)时,我希望确保窗体被正确关闭。这意味着我希望我的连接关闭,所有侧面线程终止等等。
我尝试使用FormClosing事件。在那里,我将KillThreads标志设置为true,并等待侧面线程终止。每个线程都有一个检查,类似于
但是存在一个问题。如果我尝试等待所有线程终止。
线程N3被
如果我将关闭前操作实现为线程过程4,并在FromClosing事件处理程序中创建一个新线程, 表单将立即关闭,在线程4终止之前,
我该怎么办? 有什么方法可以解决这个问题吗?
if(KillThreads)
return;
但是存在一个问题。如果我尝试等待所有线程终止。
for(;;)
if(ActiveSideThreads == 0)
break;
closeConnection();
线程N3被
Invoke()
调用冻结了;
当然,这是因为主GUI线程在无限循环中。
所以表单关闭被永远延迟了。如果我将关闭前操作实现为线程过程4,并在FromClosing事件处理程序中创建一个新线程, 表单将立即关闭,在线程4终止之前,
Invoke()
会抛出一个错误- t. 4无法及时关闭线程3。
如果我添加Join(), Invoke()
调用,又会再次阻塞,线程3永远不会终止,因此线程4将永久等待。我该怎么办? 有什么方法可以解决这个问题吗?
[线程对象].kill()
或类似的方法。 - Rev