C# 如何在窗体处于活动状态时运行后台线程?

C# 如何在窗体处于活动状态时运行后台线程?,c#,winforms,multithreading,user-interface,C#,Winforms,Multithreading,User Interface,在我的program.cs文件中,代码如下所示: static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); frmWizard frm = new frmWizard(); Application.Run(frm); Thread th = new Thread(frm.ThreadSetCom)

在我的program.cs文件中,代码如下所示:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    frmWizard frm = new frmWizard();
    Application.Run(frm);

    Thread th = new Thread(frm.ThreadSetCom);
    th.Start();
}

ThreadSetCom是一种在无止境循环中运行的方法,用于检查某些内容。我注意到ThreadSetCom只会在WinForm出现之前和我关闭表单之后执行。当窗体可见时,它不会执行。有人能帮我澄清一下吗?

Application.Run将等待,直到传递的表单in参数关闭。您可能需要在frmWizard的
加载
事件中
创建
启动
线程

private void frmWizard_Load(object sender, System.EventArgs e)
{
    Thread th = new Thread(ThreadSetCom);
    th.Start(); 
}

Application.Run将一直阻止,直到您关闭表单,这解释了为什么您会看到这种行为。Adil的答案会起作用,但我相信您不应该以这种方式耦合代码。如果主方法独立于表单加载事件启动第二个线程,则效果会更好

因此,您只需按如下方式重新排列代码:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    frmWizard frm = new frmWizard();

    Thread th = new Thread(frm.ThreadSetCom);
    th.Start();

    Application.Run(frm);
}

另外请注意,当您关闭表单时,线程仍将处于活动状态。非常感谢!成功了!不管怎样,你能给我指一个链接或者一本书,在那里我可以学到更多关于多线程的知识吗?我找不到一个对我来说足够容易理解的帖子。我找到了这篇关于多线程理解书籍的帖子,哦,太好了。。。这也是我的意图。我觉得有一根线在另一根线里不太好。听起来有点复杂。感谢您还应该将th.IsBackground=true设置为,以便在表单关闭后终止流程。否则,关闭表单后,后台线程可以继续运行。有关详细信息,请参阅此处: