我有一个mainform,可以在某个时刻打开一个StartForm:
private void TestChosen(object sender, TestChosenEventArgs e)
{
var frm = new TestStartForm(e.Test, StartTest);
frm.ShowDialog();
}
在这个StartForm上,我有一个实际开始测试的按钮。
public TestStartForm(Test test, StartTestHandler startTestHandler)
{
InitializeComponent();
_test = test;
OnStartTest = startTestHandler;
}
public delegate void StartTestHandler(object sender, StartTestEventArgs e);
public event StartTestHandler OnStartTest;
public void InvokeOnStartTest(StartTestEventArgs e)
{
StartTestHandler handler = OnStartTest;
if (handler != null) handler(this, e);
}
private void btnStart_Click(object sender, EventArgs e)
{
InvokeOnStartTest(new StartTestEventArgs(_test));
Close();
}
我面临的问题是StartForm保持打开状态,直到StartTestHandler的工作完全完成。 在StartTestHandler中,使用实际测试打开另一个表单。
有没有办法强制StartForm关闭而不等待测试结束?
修改
正如@cowboydan建议我使用BeginInvoke来显示表单。但是,在正常工作之前,我必须为StartForm以及实际的TestForm执行此操作。
private void TestChosen(object sender, TestChosenEventArgs e)
{
BeginInvoke((Action)delegate
{
var frm = new TestStartForm(e.Test, StartTest);
frm.ShowDialog();
});
}
private void StartTest(object sender, StartTestEventArgs e)
{
BeginInvoke((Action)delegate
{
var frm = new TestForm(e.Test);
frm.ShowDialog();
});
}
答案 0 :(得分:1)
您可以使用BeginInvoke,它将在与ThreadPool的单独线程中启动StartForm。这是一种相当普遍的做法。