繁体   English   中英

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

[英]One timer, many method calls or many timers, one method call?

我正在.NET CF 2.0上开发WinCE 5.0的应用程序。

我想知道其他人在以下两种情况下看到的最佳解决方案:

假设我有10个方法需要每50mS运行一次。

解决方案1:

创建一个每50mS运行一次的System.Threading.Timer,然后在此回调中运行上面提到的10个方法。

解决方案2:

创建10个System.Threading.Timer,每50mS运行一次,然后在每个回调中调用上述方法之一。

您认为哪种解决方案最好? 有些方法是cpu密集型的,有些则不是。

使用多个计时器可使呼叫独立。 这对于例外情况最为重要。 如果#2抛出,你想要其他方法继续吗? 这些方法是否相互依赖?

通过多核上的多个计时器,您可以通过在ThreadPool上执行来获利。

在Win-CE下,你可能在一个核心上运行,这也是这个推理学术的一部分。

归结为这些方法需要的准确程度。 按顺序调用每个方法(使用相同的计时器)将不会每50ms运行所有方法,因为每个方法都需要一些时间来完成。

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

我认为我根本不会使用计时器。 计时器将在它触发时产生一个线程,其中a)需要更多时间并且b)允许重入,这意味着你可以运行你的方法,特别是如果它们需要一段时间,同时。

我在启动时生成一个单独的线程(你定义了什么意思 - 应用程序启动,一些对象创建等),它按顺序执行所有读取,执行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);
    }
}

因为它看起来你不依赖于你的操作顺序,否则你不会问这个问题。

我更喜欢“每个操作1个定时器”的解决方案。 如果你的操作再次耗费时间(无论数据多少),至少其他操作仍会执行。 但我不知道这是否真的对你有帮助。 这很大程度上取决于您的需求/实施

我会选择解决方案1,至少是你的CPU密集型方法。

然后你隐式地按顺序运行你的方法。 我假设你在WinCE上没有那么多核心或那么多内存,最好的交易是不要尝试并行运行更多代码。

在解决方案2中,您可能会遇到创建多个线程同时执行10个方法的风险。 如果等待I / O,尤其是网络I / O,这可能会很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM