以随机间隔运行函数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) 创建SCTimer
和 rnd
类级别字段。 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# [重复]的主要内容,如果未能解决你的问题,请参考以下文章