以随机间隔运行函数C# [重复]

Posted

技术标签:

【中文标题】以随机间隔运行函数C# [重复]【英文标题】:Running a function at random intervals C# [duplicate] 【发布时间】: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 的值更改为一个新的随机值。 【参考方案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);

【讨论】:

以上是关于以随机间隔运行函数C# [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在love2d中以随机时间间隔调用lua函数

如何随机调用函数unity c# [重复]

C# 普通随机数 [重复]

C#使用随机数据创建对象[重复]

如何在 C# 中随机化种子 [重复]

c# 随机单个三个数作为一组,不重复之前出现的一组数据