运行 随机间隔的函数 C#

Running a function at random intervals C#

我在构造函数中调用了以下函数:

 public void IntervalSC()
 {
     Random rnd = new Random();
     double interval = rnd.Next(2000, 6000);
     var SCTimer = new System.Timers.Timer();
     SCTimer.Elapsed += new ElapsedEventHandler(dashboardController.Screenshot);
     SCTimer.Interval = interval;
     SCTimer.Enabled = true;
 }

我希望间隔运行 dashboardController.Screenshot在2000到6000之间但是在运行dom号生成后,它不会改变并保持运行ning Screenshot 函数以固定间隔由 rnd 生成。我知道这是因为 IntervalSC() 是 运行 一次,所以间隔的 运行dom 数也只生成一次。因此,我正在寻找有关如何以 运行dom 间隔 运行ning dashboardController.Screenshot 进行这项工作的建议。谢谢。

您可以在 dashboardController.Screenshot 中编辑计时器,但我觉得添加另一个处理程序来执行此操作更简洁。例如:

private Random rnd = new Random();

void Main()
{
    double interval = rnd.Next(2000, 6000);
    var SCTimer = new System.Timers.Timer();
    SCTimer.Elapsed += new ElapsedEventHandler(dashboardController.Screenshot);
    SCTimer.Elapsed += new ElapsedEventHandler(ChangeTimerInterval);
    SCTimer.Interval = interval;
    SCTimer.Enabled = true;
}

public void ChangeTimerInterval(Object source, System.Timers.ElapsedEventArgs e)
{
    var timer = source as System.Timers.Timer;
    
    timer.Interval = rnd.Next(2000, 6000);
}

你也可以这样做。

  • 它使用 异步和等待模式
  • 捕获任何同步上下文
  • 它将 运行 很好地处理异步工作负载和 UI
  • 也是可以取消的

例子

private Random rnd = new Random();

public async Task Generate(Func<Task> callback, CancellationToken cancellation)
{
   try
   {
      while (!cancellation.IsCancellationRequested)
      {
         try
         {
            await callback();
         }
         catch (Exception e)
         {
             // log your errors here
         }
  
         await Task.Delay(rnd.Next(2000, 6000), cancellation);
      }
   }
   catch (OperationCanceledException) {}
}

用法

_ = Generate(someMethodAsync, YourCancellationToken);