C#与工作线程如何关闭用户窗体

问题描述 投票:1回答:2

我以用户形式启动新线程(工作程序),当该线程需要以用户形式进行更新时,请调用Invoke方法-在主线程上调用方法委托。问题是如何成功关闭用户窗体。我需要第一次完成工作线程,该线程的时间称为主线程(调用)。如何在主线程中等待工作线程完成最后一个循环。

用户表单

  public partial class FormMain : Form
  {
    private bool isntSignaledStop=true;
    ...

这里是在工作线程上运行的循环方法。

private void MenuLoop()
{
  while (isntSignaledStop)
  {
    HeavyMethod();
    Invoke(DelegateWriteResultsToMenu);

    HeavyMethod2();
    Invoke(DelegateWriteResultsToMenu2);

    ...
  }
}

结束集的主线程isntSignaledStop = False。现在我需要等到工作线程完成。

c# multithreading userform worker
2个回答
0
投票

如果您在“ Thread2”上运行MenuLoop(假装这是名称),我将在主线程上调用Thread2.Join(),这将使主线程等待直到Thread2完成。

我建议您阅读这篇文章,它有5种不同的方式来提供很好的答案。 How to wait for thread to finish with .NET?

希望这会有所帮助!


0
投票

您可以使用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完成工作,然后关闭窗口。

© www.soinside.com 2019 - 2024. All rights reserved.