因此,我在使用的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()函数上的计时器运行一次,我不确定原因为何。有任何想法吗?不知道这篇文章是否也有意义,所以请告诉我是否需要扩展更多内容,谢谢!
答案 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) => ....