C#用户窗体与工作线程的距离有多近

C#用户窗体与工作线程的距离有多近,c#,multithreading,userform,worker,C#,Multithreading,Userform,Worker,我在userform中启动新线程(worker),当该线程需要在userform中更新某些内容时,在主线程上调用Invoke-method-Invoke-method委托。问题是如何成功地关闭userform。我需要第一次完成工作线程,从这个线程是时间为时间称为主线程(调用)。如何在主线程中等待工作线程完成最后一个循环 用户窗体 public partial class FormMain : Form { private bool isntSignaledStop=true;

我在userform中启动新线程(worker),当该线程需要在userform中更新某些内容时,在主线程上调用Invoke-method-Invoke-method委托。问题是如何成功地关闭userform。我需要第一次完成工作线程,从这个线程是时间为时间称为主线程(调用)。如何在主线程中等待工作线程完成最后一个循环

用户窗体

  public partial class FormMain : Form
  {
    private bool isntSignaledStop=true;
    ...
下面是一个在工作线程上运行的循环方法

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

    HeavyMethod2();
    Invoke(DelegateWriteResultsToMenu2);

    ...
  }
}

端部的主螺纹设置为NtSignaledStop=False。现在,我需要等待工作线程完成。

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

我推荐阅读这篇文章,它有一个非常好的答案,有5种不同的方法


希望这有帮助

您可以使用
async/await
方法,并使用
tasks
而不是
threads
。重新设计
菜单操作
方法以返回
任务

private volatile bool isntSignaledStop = true;
private async void ButtonStart_Click(object sender, EventArgs e)
{
    await MenuLoop();
    Close();
}

private Task MenuLoop()
{
    return Task.Run(() =>
    {
        while (isntSignaledStop)
        {
            HeavyMethod();
            Invoke(DelegateWriteResultsToMenu);

            HeavyMethod();
            Invoke(DelegateWriteResultsToMenu);
        }
    });
}
private void ButtonStop_Click(object sender, EventArgs e)
{
    isntSignaledStop = false;
}

在UI线程中,您可以异步等待,直到
MenuLoop
完成工作,然后关闭窗口。

谢谢您的帮助,但我希望我找到了使用线程的方法。在工作线程上运行主代码。因为userform本身可以按我的需要工作,它允许用户输入,或者执行从另一个线程调用的方法,如果它什么也不做,那么等待…

Join()会导致死锁,因为锁定主线程并等待线程2,但他会在锁定的主线程上调用方法。