-2

我在构造函数上调用了这个函数:

 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 之间运行,但是在生成随机数后,它不会改变并继续Screenshotrnd. 我知道这是因为IntervalSC()运行一次,所以间隔的随机数也只生成一次。因此,我正在寻找有关如何使这项工作dashboardController.Screenshot以随机间隔运行的建议。谢谢你。

4

2 回答 2

4

你可以在里面编辑计时器,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);
}
于 2020-10-26T03:35:43.300 回答
0

你也可以做这样的事情。

  • 它使用async 和 await 模式
  • 捕获任何同步上下文
  • 它将与异步工作负载和 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);
于 2020-10-26T04:15:55.437 回答