停止计时器并从其他功能重启

时间:2018-11-01 21:18:09

标签: c#

我有这个计时器,

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函数中),然后暂时停止它,然后再在另一个函数中重新启动它?

3 个答案:

答案 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();
        }
    }