我有一个以我的主要形式开始的线程
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;
答案 0 :(得分:2)
您的原始代码没有意义。它显示一个表单,然后启动一个线程,然后等待该线程完成。如果您希望表单在其自己的UI线程上运行,请让ProcessInkPresenter
在相同的UI线程上运行(如果它与UI交互,它应该运行)并使表单关闭并在{{1完成,试试这个:
ProcessInkPresenter
如果工作线程不必与GUI交互,那么您想要的是如下所示。请注意,我使用Invoke确保与UI的交互在UI线程上完成。这里没有必要检查InvokeRequired,因为我已经确定我在后台线程。
如果你想保持相同的waitForm实例:
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();
}
注意:如果你有一个单一的实例(你的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
。