【问题标题】:Running a function at random intervals C# [duplicate]以随机间隔运行函数C# [重复]
【发布时间】:2021-02-08 08:34:12
【问题描述】:

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

 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。谢谢。

【问题讨论】:

  • 1) 创建 SCTimerrnd 类级别字段。 2) 向SCTimer.Elapsed 添加第二个处理程序。 3) 在第二个处理程序的实现中,将SCTimer.Interval 的值更改为一个新的随机值。

标签: c# timer system.timers.timer


【解决方案1】:

您可以在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);
}

【讨论】:

    【解决方案2】:

    你也可以这样做。

    • 它使用 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 2021-05-31
      相关资源
      最近更新 更多