我以用户形式启动新线程(工作程序),当该线程需要以用户形式进行更新时,请调用Invoke方法-在主线程上调用方法委托。问题是如何成功关闭用户窗体。我需要第一次完成工作线程,该线程的时间称为主线程(调用)。如何在主线程中等待工作线程完成最后一个循环。
用户表单
public partial class FormMain : Form
{
private bool isntSignaledStop=true;
...
这里是在工作线程上运行的循环方法。
private void MenuLoop()
{
while (isntSignaledStop)
{
HeavyMethod();
Invoke(DelegateWriteResultsToMenu);
HeavyMethod2();
Invoke(DelegateWriteResultsToMenu2);
...
}
}
结束集的主线程isntSignaledStop = False。现在我需要等到工作线程完成。
如果您在“ Thread2”上运行MenuLoop(假装这是名称),我将在主线程上调用Thread2.Join(),这将使主线程等待直到Thread2完成。
我建议您阅读这篇文章,它有5种不同的方式来提供很好的答案。 How to wait for thread to finish with .NET?
希望这会有所帮助!
您可以使用async/await
方法并使用tasks
而不是threads
。重新设计MenuLoop
方法以返回Task
:
private volatile bool isntSignaledStop = true;
private async void ButtonStart_Click(object sender, RoutedEventArgs e)
{
await MenuLoop();
Close();
}
private Task MenuLoop()
{
return Task.Run(() =>
{
while (isntSignaledStop)
{
HeavyMethod();
Invoke(DelegateWriteResultsToMenu);
HeavyMethod();
Invoke(DelegateWriteResultsToMenu);
}
});
}
private void ButtonStop_Click(object sender, RoutedEventArgs e)
{
isntSignaledStop = false;
}
在UI线程中,您可以异步等待直到MenuLoop
完成工作,然后关闭窗口。