从线程关闭窗体
本文关键字:窗体 线程 | 更新日期: 2023-09-27 18:26:00
我有一个线程,它以我的主窗体开始
private void changePasswordbutton_Click_1(object sender, EventArgs e)
{
waitForm.Show();
Thread thread = new Thread(ProcessInkPresenter);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
waitForm.Hide();
waitForm.Dispose();
}
我想关闭ProcessInkPresenter方法(在线程上运行)中的waitForm,而不是等待线程完成。
我该怎么做?
感谢
方法签名
private void ProcessInkPresenter()
在类标题中定义
Wait waitForm;
您的原始代码没有意义。它显示一个表单,然后启动一个线程,然后等待该线程完成。如果你想让表单在它自己的UI线程上运行,让ProcessInkPresenter
在同一个UI线程上(如果它与UI交互,应该是这样)运行,并关闭表单,并在ProcessInkPresenter
完成时处理掉,请尝试以下操作:
private void changePasswordbutton_Click_1(object sender, EventArgs e)
{
Thread thread = new Thread(state => {
using (var waitForm = new WaitForm()) {
waitForm.Activated += (s, e) => {
ProcessInkPresenter();
waitForm.Hide();
}
Application.Run(waitForm);
}
}
);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
如果工作线程不必与GUI交互,那么您需要的内容如下所示。请注意,我使用Invoke来确保与UI的交互是在UI线程上完成的。这里不需要检查InvokeRequired,因为我已经确定我在后台线程上了。
如果你想保留相同的waitForm实例:
private void changePasswordbutton_Click_1(object sender, EventArgs e)
{
Thread thread = new Thread(state => {
try {
ProcessInkPresenter();
// If ProcessInkPresenter fails, this line will never execute
waitForm.Invoke(new Action(()=>waitForm.Hide()));
}
catch (Exception ex) {
// You probably want to do something with ex here,
// rather than just swallowing it.
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
waitForm.Show();
}
注意:如果您只有一个WaitForm实例(Wait
实例),那么处理它是没有意义的。每次使用实例时都构造一个实例,或者从不处理它,而是使用.Hide()
。