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
的值更改为新的随机值。