WPF - 由线程创建的计时器不起作用

时间:2013-08-12 13:04:45

标签: .net wpf

问题是关于在每个创建的线程中使用计时器。

我正在编写一个应用程序,每30秒从PC收集一次CPU数据。如果我只从1台PC收集数据并使用1个计时器,没有任何线程,它就可以工作。现在,我想同时从2台PC上收集数据。为此,我决定使用线程,每个线程将适用于每台PC并具有自己的计时器。因此,2个线程,2个计时器,2台PC。我使用System.Windows.Threading.DispatcherTimer来为每个线程创建一个计时器。但是,问题是创建的计时器没有开始工作(即不调用timerTick)。 因此,如果我创建一个没有线程的计时器,那么它可以正常工作,而线程创建的计时器不起作用。 :(

也许所考虑的解决方案不正确,需要进行一些更改。请帮我理解这个问题。

以下是代码的简单版本:

void CreateThread()
{
    Thread First = new Thread(new ThreadStart(FirstThreadWork));
    First.Start();
}

private void FirstThreadWork()
{
    System.Windows.Threading.DispatcherTimer timer;

    timer = new System.Windows.Threading.DispatcherTimer();

    timer.Tick += new EventHandler(timerTick);
    timer.Interval = new TimeSpan(0, 0, 30);
    timer.Start();
}

private void timerTick(object sender, EventArgs e)
{
    MessageBox.Show("Show some data");
}

1 个答案:

答案 0 :(得分:2)

DispatcherTimer仅在UI线程上创建但在后台线程上创建时才起作用。如果您不打算操纵timerTick方法中的任何UI元素,那么您可能需要考虑System.Timers.Timer

可以在this blog post

找到.net中所有可用计时器的详细讨论

示例代码

    void StartTimer()
    {
        var timer = new System.Timers.Timer();

        timer.Elapsed += timerTick;
        timer.Interval = 30000;
        timer.Enabled = true;
        timer.Start();

    }

    private void timerTick(object sender, EventArgs e)
    {
        MessageBox.Show("Show some data");
    }