C# 为不同的双间隔值使用相同计时器的多个任务 请考虑下面的测试程序。 我有三个特定时间间隔的任务。[task1--task1Interval,[task2--task2Interval,[task3--task3Interval] 我想用一个定时器来执行这三个任务。 当间隔为整数时,一切正常。 我们希望通过双间隔值实现相同的功能,例如[task1Interval--0.1、[task2Interval--2.1、[task3Interval--3.1]

C# 为不同的双间隔值使用相同计时器的多个任务 请考虑下面的测试程序。 我有三个特定时间间隔的任务。[task1--task1Interval,[task2--task2Interval,[task3--task3Interval] 我想用一个定时器来执行这三个任务。 当间隔为整数时,一切正常。 我们希望通过双间隔值实现相同的功能,例如[task1Interval--0.1、[task2Interval--2.1、[task3Interval--3.1],c#,C#,如果您有任何相同的建议,我们将不胜感激 public class Class1 { private System.Timers.Timer _timer; private int _counter=0; private int task1Interval = 1; private int task2Interval = 2; private int task3Interval = 3; public void Start() {

如果您有任何相同的建议,我们将不胜感激

public class Class1
{
    private System.Timers.Timer _timer;
    private int _counter=0;
    private int task1Interval = 1;
    private int task2Interval = 2;
    private int task3Interval = 3;

    public void Start()
    {
        this._timer = new System.Timers.Timer(100);
        this._timer.AutoReset = true;
        this._timer.Elapsed += new System.Timers.ElapsedEventHandler(this.serviceTimerElapse);
        this._timer.Enabled = true;
        this._timer.Start();
    }

    private void serviceTimerElapse(object source, System.Timers.ElapsedEventArgs e)
    {
        this._counter++;
        if (this._counter % task1Interval == 0)
        {
            task1();    
        }
        if (this._counter % task2Interval == 0)
        {
            task2();
        }
        if (this._counter % task3Interval == 0)
        {
            task3();
        }
    }
    private void task1()
    {
        Console.WriteLine("task1 started");

    }
    private void task2()
    {
        Console.WriteLine("task2 started");

    }
    private void task3()
    {
        Console.WriteLine("task3 started");

    }
}

这在一个原始的游戏引擎中是很常见的。你需要一个具有一定粒度的世界“时钟”,你在每个“滴答”中处理每个事件

您已经知道您的粒度需要是间隔中最小的公分母(在本例中为0.1)。然后,基本解决方案将包括每个任务的计数器以及阈值

Ex(伪代码):


那么你的问题是什么呢?非常感谢你的宝贵意见。希望能有所帮助。如果适合你,请将其标记为正确答案。
private const double TICK = 0.1;
private double TASK_1_THRESHOLD = 0.1;
private double TASK_1_COUNT = 0.0;
private double TASK_2_THRESHOLD = 2.1;
private double TASK_2_COUNT = 0.0;
private double TASK_3_THRESHOLD = 3.1;
private double TASK_3_COUNT = 0.0;

    private void tick()
{
   TASK_1_COUNT += TICK;
   TASK_2_COUNT += TICK;
   TASK_3_COUNT += TICK;

   if (TASK_1_COUNT >= TASK_1_THRESHOLD) {
       TASK_1_COUNT = 0.0;     
       task1();
     }
    // do this for each
}