我有这个计时器,
public static int mystery() {
int[] a = { 1, 3, -10, 12, 3, 20 };
int r = Math.abs(a[0] - a[1]);
for (int i = 1; i < a.length; i++) {
int newR = Math.abs(a[i - 1] - a[i]);
if (newR > r) {
r = newR;
}
}
return r;
}
计划每分钟尝试运行一个函数(startAutoSpec),然后该函数运行各种代码以尝试查找英雄联盟的实时比赛。因此,就目前而言,它只会保持每分钟重新运行此功能,并打开游戏的多个窗口,所有窗口都会崩溃。
所以我的问题是是否可以从startAutoSpec函数访问此计时器(位于Main函数中),然后暂时停止它,然后再在另一个函数中重新启动它?
答案 0 :(得分:3)
您需要将计时器的定义移出Main
函数的范围之外:
System.Timers.Timer t;
void Main()
{
t = new System.Timers.Timer(TimeSpan.FromMinutes(1).TotalMilliseconds);
t.AutoReset = true;
t.Elapsed += new System.Timers.ElapsedEventHandler(startAutoSpec);
t.Start();
}
void SomeOtherFunction()
{
t.Stop();
}
如果您不明白为什么这样做,请使用Google“变量范围”。
答案 1 :(得分:0)
传递给事件处理程序的第一个参数称为“发送者”,它是引发事件的对象,在这种情况下为计时器。您可以将其转换为正确的类型,然后将其停止。
答案 2 :(得分:-1)
执行一个运行startAutoSpec
的任务。
将t.Elapsed
的操作更改为以下内容:
t.Elapsed += () =>
{
if (autoSpecTask.IsCompleted)
{
autoSpecTask = new Task(() => startAutoSpec);
autoSpecTask.Start();
}
}