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

时间:2011-11-04 15:04:50

标签: c# process infinite-loop

我在ac#程序中使用线程,但是线程运行的进程,调用另一个函数,它有一个锁定程序的无限循环,如果我点击另一个选项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()函数中,我正在谈论无限循环

编辑这是 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
    ...   
}

}

谢谢。

5 个答案:

答案 0 :(得分:2)

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

关键是System.Windows.Forms.Application静态类,它具有为此所需的功能量身定制的功能。

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

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

您要做的是创建所有表单,然后依次为每个表单调用Show() ShowDialog()),然后最后调用Application.Run()。这可以让你得到你想要的东西。

为了结束你的程序,你需要在某个地方打电话Application.Exit(),以回应某些事情。您有两个选项可以快速为您服务:

  • 创建一个单独的“控制表单”,它只是一个简单的表单,在关闭时,可以调用Application.Exit(),可能是在遍历所有用户管理表单并关闭它们之后。例如,您可以使用控件表单的Form.OnClosing事件中的事件来执行此操作。
  • 向每个用户管理表单Form.OnClosing事件添加一个事件,以检查最后一个事件何时关闭(或者可能是否已关闭其中任何一个?),如上所述,调用Application.Exit()那里。

一旦你打电话给Application.Exit(),任何打开的表格都应该被拆除(我建议先手动完成......)然后你在Application.Run()主线程中的通话就会完成,这样就可以了程序继续...我们推测,结束。

<小时/> 编辑:旧答案,后人......

您正在错误的位置创建新主题。

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

理想情况下,这个循环应该有一种优雅的取消方式,但你似乎建议你不能触摸那个代码......

答案 1 :(得分:0)

你应该避免繁忙的循环,为什么你不能在一些睡眠或暂停系统调用上循环?

答案 2 :(得分:0)

除了这个好主意之外,您是否尝试过BackgroundWorker?

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=VS.80).aspx

答案 3 :(得分:0)

答案 4 :(得分:0)

这与线程无关 - 即使你从主线程中调用这个“无限循环函数”,它仍会挂起你的程序。

所以,无论是谁创作了这个函数,他/她就已经实现了一些机制来阻止它,否则它将毫无用处。如果没有强行杀死线程(Thread.Abort),我建议调查这个机制并在你的线程中使用它。

BTW,这个功能的目的是什么?某种消息处理?

---编辑---

好的,所以你的“无限循环”实际上是Form.ShowDialog。它内部包含一个消息泵,并且以编程方式停止该泵的方法是设置Form.DialogResult。请注意,您需要将所有UI调用封送到正确的线程,如this post所示。

另外,尝试从Application.Run(Form)开始,而不是Form.ShowDialog