这就是我所拥有的。当我的应用程序启动时,它会创建一个线程并运行我的startListening()
函数。但它似乎做的是在同一个线程下运行startListening
内调用的任何其他函数。有没有一种方法可以让它成为startListening
内的东西只用那个线程运行,而不是从那个内部调用的函数?
在引用不在该线程内的控件和事物时,它会让我更容易,所以我不必每次都调用。
编辑:也许这不是正确的问题。我知道我必须Invoke
设置文本框,但现在我需要启用一个计时器。当我尝试启用它时,它不会抛出任何异常,而只是不“滴答作响”。这是我的代码:
private void beginListenerThread()
{
Thread thread1 = new Thread(startListening);
thread1.Start();
}
private void startListening()
{
timer1.enabled = true;
}
但它没有打勾。
谢谢!
答案 0 :(得分:5)
不,那是不可能的。如果您能够修改应在另一个线程上调用的方法,请将调用更改为其他方法,以便它们在原始线程上运行。如果您使用的是Windows表单,请使用this.Invoke
或this.BeginInvoke
,例如。
答案 1 :(得分:1)
是的,当您使用线程上不是线程安全的类时,这会遇到麻烦。 Winforms Timer类从一个隐藏的小帮助窗口生成Tick事件,该窗口接收由Windows SetTimer()api函数生成的WM_TIMER消息并将它们转换为Tick事件调用。启用计时器时会创建该窗口。
这里出现的问题是这个窗口是在错误的线程上创建的。它需要一个消息泵来分派WM_TIMER通知,该线程没有。它可以有一个通过调用Application.Run(),但你不想去那里。
遵循MSDN Library文章的备注部分中提供的建议:
Windows窗体计时器组件是单线程的,精度限制为55毫秒。如果需要更高精度的多线程计时器,请在System.Timers命名空间中使用Timer类。
或System.Threading.Timer类,一个不那么胡思乱想的计时器类。