一个定时器,多个方法调用还是多个定时器,一个方法调用?

6
我正在开发一个基于.NET CF 2.0的WinCE 5.0应用程序。
我想知道在以下两种情况下,其他人认为最好的解决方案是什么:
假设我有10个方法需要每50毫秒运行一次。
解决方案1:
创建一个System.Threading.Timer,每50毫秒运行一次,并在此回调中运行上述10个方法。
解决方案2:
创建10个System.Threading.Timer,每50毫秒运行一次,并在它们各自的回调中调用其中一个上述方法。
你认为哪种解决方案最好?其中一些方法会占用CPU,而另一些则不会。
5个回答

3
使用多个定时器使调用独立。这在异常处理方面最为重要。如果#2抛出异常,您是否希望其他方法继续执行?这些方法是否相互依赖?
在多核计算机上使用多个定时器可以利用线程池进行执行。
在Win-CE下,您可能正在单核计算机上运行,因此部分推理是学术性的。

确实,这是在一颗PXA270(208MHz)CPU上运行的单核环境。 - user653258

1

我认为我根本不会使用计时器。当计时器触发时,它将生成一个线程,这需要更多的时间,并允许重新进入,这意味着您可能会同时运行方法,特别是如果它们需要一段时间。

我会在启动时(您定义什么是启动 - 应用程序启动,某些对象创建等)生成一个单独的线程,按顺序执行所有读取操作,进行Sleep调用,然后重复执行。

大致如此:

private void Startup()
{
    new Thread(WorkerProc) { IsBackground = true }
    .Start();
}

private void WorkerProc()
{
    int pollPeriod = 50;

    while (true)
    {
        var et = Environment.TickCount;

        // call your methods

        et = Environment.TickCount - et;
        var sleep = pollPeriod - et;
        if (sleep < 0) sleep = 0; // always yield
        Thread.Sleep(sleep);
    }
}

这正是我之前的写法,直到我看了看 System.Threading.Timer 类!除了你做的 50 毫秒校准外。我还得出结论:为每个操作使用定时器比上述解决方案消耗更多资源。 - user653258

1

这归结于这些方法需要多精确。按顺序调用每个方法(使用相同的计时器)不会每50毫秒运行所有方法,因为每个方法都需要时间来完成。

如果所有方法必须每50秒运行一次:请使用不同的计时器;否则请使用相同的计时器。


在单核处理器上,它们永远无法在50毫秒的时钟周期内全部运行。 - H H
任务每50毫秒运行一次并不是很重要。我的问题更多与性能有关,因为它在一个不太快的CPU(PXA270 208MHz)上运行。从性能角度来看,创建一个调用所有方法然后休眠50毫秒的线程是否更快,还是使用一个定时器或每个方法一个定时器? - user653258

0

从你的问题来看,似乎你不依赖于操作的顺序,否则你就不会问这个问题了。

我更喜欢“每个操作一个计时器”的解决方案。如果你有一个操作需要更多时间(例如大量数据),至少其他操作仍然会被执行。但我不知道这是否真正有助于你。这在很大程度上取决于你的需求/实现。


0

我会选择方案1,至少对于你的CPU密集型方法来说是这样。

然后你隐式地按顺序运行你的方法。我假设由于你在WinCE上,你没有那么多核心或那么多RAM,最好的折衷办法是不要尝试并行运行比必要更多的代码。

在方案2中,你面临着创建多个线程同时执行你的10个方法的风险。如果你正在等待I/O,特别是网络I/O,这可能是好的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接