2

这就是我所拥有的。当我的应用程序启动时,它会创建一个线程并运行我的startListening()函数。但它似乎做的是运行startListening在同一线程下调用的任何其他函数。有没有办法让我只startListening使用该线程运行内部的东西,而不是从其中调用的函数?

当引用不在该线程中的控件和事物时,它只会让我更轻松,因此我不必每次都调用。

编辑:也许这不是正确的问题。我知道我必须Invoke设置文本框,但现在我需要启用计时器。当我尝试启用它时,它不会抛出任何异常,而只是不“滴答作响”。这是我的代码:

    private void beginListenerThread()
    {
        Thread thread1 = new Thread(startListening);
        thread1.Start();
    }

    private void startListening()
    {
        timer1.enabled = true;
    }

但它不打勾。

谢谢!

4

2 回答 2

5

不,这是不可能自动完成的。如果您能够修改应该在另一个线程上调用的方法,请更改对其他方法的调用,以便它们在原始线程上运行。例如,如果您使用的是 Windows 窗体,请使用this.Invokethis.BeginInvoke

于 2012-07-21T17:18:13.160 回答
1

是的,当您在线程上使用非线程安全的类时,您会遇到这种麻烦。Winforms Timer 类从一个隐藏的小帮助窗口生成 Tick 事件,该窗口接收由 Windows SetTimer() api 函数生成的 WM_TIMER 消息并将它们转换为 Tick 事件调用。该窗口是在您启用计时器时创建的。

这里的问题是这个窗口是在错误的线程上创建的。它需要一个消息泵来分派 WM_TIMER 通知,该线程没有。它可以通过调用 Application.Run() 得到一个,但你不想去那里。

遵循 MSDN 库文章的备注部分中给出的建议:

Windows 窗体计时器组件是单线程的,精度限制为 55 毫秒。如果您需要更准确的多线程计时器,请使用 System.Timers 命名空间中的 Timer 类。

或者 System.Threading.Timer 类,一个不那么古怪的计时器类。

于 2012-07-21T17:59:45.993 回答