C#用户窗体与工作线程的距离有多近
我在userform中启动新线程(worker),当该线程需要在userform中更新某些内容时,在主线程上调用Invoke-method-Invoke-method委托。问题是如何成功地关闭userform。我需要第一次完成工作线程,从这个线程是时间为时间称为主线程(调用)。如何在主线程中等待工作线程完成最后一个循环 用户窗体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;
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,但他会在锁定的主线程上调用方法。