线程c#停止执行程序,而不使用线程使程序继续运行
本文关键字:线程 程序 运行 继续 执行程序 | 更新日期: 2023-09-27 18:13:38
我在c#中使用-first - time- threads -with多参数。我的问题是:
如果我使用函数-我将发布它-没有威胁,它将遵循程序的自然逻辑。然而,我需要使用线程来同时调用函数的多个实例。但是当我使用线程时,程序的执行停止,尽管我知道线程正在正确地调用函数,因为我短暂地看到它 -它弹出一个Windows窗体!然后打印一些我输入的消息-
我不知道为什么,是相对简单的函数。我认为它可能是与EventArgs的东西,但不确定-我也把它作为参数传递!
让我们看看线程和函数:
//This is the function that I call in the threads
public void device(object i, object s, object f)
{
int j = (int)i;
EventArgs g = (EventArgs)f;
//Connect the devices
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]);
//Open a windows form and show the interface!
userTest.Show();
}
// The function with the threads
private void userTest_Click(object sender, EventArgs e)
{
...
//This loop if for testing, the actual value will be other.
for (int i = 0; i < 2; i++)
{
//Notice that I´m sending 3 parameters!
Thread t = new Thread(unused => device(i, sender, e));
try
{
t.Start();
}
catch (ThreadStateException f)
{
MessageBox.Show("ERROR:" + f);
}
}
}
谢谢。
当线程结束时,表单将超出作用域。你需要做一些事情来保持对它的引用是有效的。
与来自不同线程的控件交互通常也是一个坏主意。尝试从创建控件的线程以外的线程访问控件可能会导致跨线程异常。您必须调用Invoke或BeginInvoke来将调用封送到正确的线程。
如果这是你第一次查看线程,我建议你停在这里,看看别的东西!:)首先,您在这里尝试做的是新的Async库(http://msdn.microsoft.com/en-us/vstudio/gg316360)的完美候选。请注意,虽然它是CTP,但MS确实支持使用它的配置。
如果你真的需要使用类似线程所提供的东西,你可以使用任务并行库。你可以把任务看作是轻量级线程。
今天我唯一会使用线程的情况是当我有一个长时间运行的操作,我需要完全控制。
最诚挚的问候,
Tibi
少数