C#-由线程的回调运行的计时器仅运行一次

时间:2018-11-04 11:59:45

标签: c#

因此,我在使用的C#应用​​程序中的线程和计时器遇到了一个小问题,其中按键计时器仅运行一次。

这是启动初始线程的程序的主要功能:

private static System.Threading.Timer timer;

static void Main(string[] args) 
{
    timer = new System.Threading.Timer(_ => startAutoSpec(), null, 1000 * 5, Timeout.Infinite);
}

此后,在startAutoSpec(下面)函数中,它将运行整个代码(我看不到需要添加的代码),并且出于所有目的和目的,此代码都可以正常运行

public static void startAutoSpec() 
{
    if (noGamesFound) {
        timer.Dispose();
        timer = new System.Threading.Timer(_ => startAutoSpec(), null, 1000 * 60, Timeout.Infinite);
    } else 
    { 
        startSpectating(args here);
        timer.Dispose();
    }
}

现在这是我们要解决的主要问题,在startSpectating函数内部初始化了计时器。它似乎只运行一次。

public static void startSpectating(whatever args) 
{
    all the spectating related stuff
    var timer = new System.Threading.Timer((e) =>
    {
        stillInGame(summoner.id.ToString(), region, gameid.ToString());
    }, null, startTimeSpan, periodTimeSpan);
}

依次运行此检查器

public static void stillInGame(string sumId, string region, string gameId)
{
    checks that game is still active
    Console.WriteLine("Checking if still ingame...");
    if (game is finished) {
        close the game process
        timer = new System.Threading.Timer(_ => startAutoSpec(), null, 1000 * 60, Timeout.Infinite);
    }
}

因此,我认为我需要提供有关线程和计时器如何工作的完整上下文,以最好地描述我的问题。 stillInGame()函数仅从startSpectating()函数上的计时器运行一次,我不确定原因为何。有任何想法吗?不知道这篇文章是否也有意义,所以请告诉我是否需要扩展更多内容,谢谢!

1 个答案:

答案 0 :(得分:3)

在方法startSpectating中,您没有重新分配静态timer字段。相反,您在该方法内创建了一个新变量timer,该方法存在且变量失去作用域后,该变量就可以进行垃圾回收。您可能打算像在其他方法中一样将新计时器分配给静态field计时器。如果没有,请创建一个新字段并为其分配新的计时器。

public static void startSpectating(whatever args) 
{
    var timer = new System.Threading.Timer((e) => ....
    // should be
    timer = new System.Threading.Timer((e) => ....