c# - 如何在不挂起程序的情况下运行无限循环? (C#)

标签 c# process infinite-loop

我在 C# 程序中使用线程,但线程运行的进程调用另一个函数,该函数具有锁定程序的无限循环,也就是说,如果我单击另一个选项Windows 窗体(例如:关闭等)将不再响应。

这个循环是必要的,而且现在无法更改。

有没有一种方法可以让我像“后台”一样运行这个循环并仍然使用程序中的其他选项,这是:循环不会阻止进程(我不喜欢在线程中使用线程!)。

Main Program
     |
     -------Thread(Function)
                       |
                       --------In the function ANOTHER
                               function is called with 
                               an infinite loop inside 
                               (this loop is NOT part of the 
                                Thread function directly)     

编辑:添加一些示例代码:

//Here I call the threads
private void userTest_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < numberOfDevices; i++)
        {
            try
            {
            Thread t = new Thread(unused => device(i, sender, e));
            t.IsBackground = true;
            t.Start();
            }
            catch (ThreadStateException f)
            {
                MessageBox.Show("ERROR:" + f);  // Display text of exception
            }
         }
      }

线程函数:

    //This infinite loop is useless, so it could be deleted. This is not
    // the loop I´m talking about
    public void device(object i, object s, object f)
    {
        while (true)
        {
            if (!killEm)
            {
                int j = (int)i;
                EventArgs g = (EventArgs)f;
                BSSDK.BS_SetDeviceID(m_ConnectedDeviceHandle[j],
                 m_ConnectedDeviceID[j], m_ConnectedDeviceType[j]);

                UserManagement userTest = new UserManagement();


                userTest.SetDevice(m_ConnectedDeviceHandle[j],
                    m_ConnectedDeviceID[j], m_ConnectedDeviceType[j]);
                userTest.ShowDialog();

            }
            else
            {
                userTest.Dispose();
                MessageBox.Show("Why don´t u kill it!!?");
                break;
            }
        }
    }

userTest.ShowDialog() 函数中就是我所说的无限循环

EDIT 这是在 userTest.ShowDialog()

中调用的函数的一部分
private void user_Click(object sender, EventArgs e) {

//THIS IS THE LOOP I´M TALKING!
while (true) {
    Keep listening for an user put his finger in the device
    ...
    Do things with that finger template
    ...   
}

谢谢。

最佳答案

好的;好消息是:您根本不需要线程。您在这里基本上拥有的是“窗体”形式的常规 Windows 窗体组件。这些表格必须保持“事件”状态,以响应事件。不过,您不需要创建线程来执行此操作。

关键是 System.Windows.Forms.Application静态类,它有一个为您在这里需要的功能量身定制的功能。

System.Windows.Forms.Application.Run();

此方法让您的 Form对象继续运行,响应事件,而不让调用它的函数继续运行。它“阻塞”,让消息泵响应,直到Application.Exit()。或调用其他一些类似的方法。

在您的案例中,您要做的是创建所有表单,然后调用 Show()依次对每一个(不是 ShowDialog() ),然后最后调用 Application.Run() .这会让你得到你想要的。

为了结束你的程序,你需要调用Application.Exit()发生在某处,以回应某事。您有两个可以快速为您工作的选项:

  • 创建一个单独的“控制表单”,它只是一个普通表单,关闭时调用 Application.Exit() ,也许在循环遍历所有 userManagement 表单并关闭它们之后,首先。您可以使用控件表单的 Form.OnClosing 上的事件来执行此操作事件,例如。
  • 向每个 userManagement 表单的 Form.OnClosing 添加一个事件检查最后一个何时关闭的事件(或者可能是否有任何一个关闭?),并且像上面一样调用 Application.Exit()那里。

一旦您调用 Application.Exit() , 任何打开的表单都应该被拆除(我建议首先手动进行......)然后你在主线程中调用 Application.Run()将完成,允许您的程序继续......我们假设,结束。


编辑:旧答案,为了后代......

您在错误的地方创建了新线程。

不要为第二个窗口创建新线程。相反,为长时间运行的任务创建一个新线程,并确保将其设置为后台线程,这样即使您关闭窗口它也不会保持事件状态。

理想情况下,这个循环应该有办法优雅地取消,但你似乎建议你不能触摸那个代码......

关于c# - 如何在不挂起程序的情况下运行无限循环? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011325/

相关文章:

tomcat - CometProcessor 结束事件循环

c# - 其他进程的 GetKeyboardLayoutName?

c++ - PROCESSENTERY32 结构中的 szExeFile 给出了一个奇怪的值

powershell - 尝试通过 PowerShell 脚本查找并终止进程

haskell - 乘以零时的惰性求值

java - Android 中的无限循环线程

c# - 动态定义需要识别值的键名

c# - 如何在同一URL下托管多个.NET Core应用

c# - 从 T-SQL 中的字符列获取数字

php - 在流中读取实时整个输出