我目前正试图在测试软件上实现自动保存功能。等待线程完成而不阻止UI线程
“开始”按钮触发TestThread进行测试。 UI通过TestThread的Invokes进行更新,为测试人员提供有关测试的实时信息。当用户点击“停止”按钮时,会设置一个标志,通知TestThread完成当前测试并停止。它还禁用UI上的控件并触发StopThread来监视TestThread的进度。当TestThread完成时,StopThread重新启用UI控件。
此时,我需要等待StopThread完成,才能调用自动保存(导致Excel文件生成的SaveFileDialog)。但是,在“停止”按钮中使用StopThread.Join()单击处理程序似乎只会导致程序挂起。这可能是因为TestThread需要时间来完成并尝试更新被阻止的UI线程。
从StopThread调用保存函数会生成一个ThreadStateException,因为我使用SaveFileDialog(模式窗体),并且显然要求将调用线程设置为“单线程公寓”。
对此的搜索似乎指向简单使用Thread.Join()的一般答案。一个简单的事实,我需要保持UI活动,直到线程完成使这无法使用。有没有一种方法可以从StopThread调用SaveFileDialog,但将它编组到UI线程?还有其他建议吗?提前致谢。
工作液:
private void btn_Stop_Click(object sender, EventArgs e)
{
//Disable UI controls and flag test ending
Thread StopThread = new Thread(WaitForTestEnd);
StopThread.Start();
}
private void WaitForTestEnd()
{
while (!testStopped) //Flag set at end of TestThread
{
Thread.Sleep(50);
}
//Re-enable UI
AutoSave saveMyData = SaveData;
Invoke(saveMyData);
}
private delegate void AutoSave();
private void SaveData()
{
//Generate SaveFileDialog and save.
}
啊,我真的需要习惯多线程。感谢您指点我正确的方向。更新我的问题与我如何实施此解决方案。 – Bandoth