C# - 只使用线程运行立即函数?

时间:2012-07-21 17:13:55

标签: c# multithreading

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

在引用不在该线程内的控件和事物时,它会让我更容易,所以我不必每次都调用。

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

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

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

但它没有打勾。

谢谢!

2 个答案:

答案 0 :(得分:5)

不,那是不可能的。如果您能够修改应在另一个线程上调用的方法,请将调用更改为其他方法,以便它们在原始线程上运行。如果您使用的是Windows表单,请使用this.Invokethis.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类,一个不那么胡思乱想的计时器类。