Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以随机间隔C运行函数#_C#_Timer_System.timers.timer - Fatal编程技术网

C# 以随机间隔C运行函数#

C# 以随机间隔C运行函数#,c#,timer,system.timers.timer,C#,Timer,System.timers.timer,下面是我调用构造函数的函数: 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);

下面是我调用构造函数的函数:

 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;
 }

我希望间隔在2000和6000之间运行
dashboardController.Screenshot
,但在生成随机数后,它不会改变,并以
rnd
生成的固定间隔继续运行
Screenshot
功能。我知道这是因为
IntervalSC()
运行了一次,所以间隔的随机数也只生成了一次。因此,我正在寻找关于如何使其工作的建议,以随机间隔运行
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);
1) 创建
SCTimer
rnd
类级字段。2) 将第二个处理程序添加到
SCTimer.appeased
。3) 在第二个处理程序的实现中,将
SCTimer.Interval
的值更改为新的随机值。