我在 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/