gpt4 book ai didi

c# - System.Threading.Timer 中的回调过程中的 FOR 循环导致它仅触发一次

转载 作者:太空宇宙 更新时间:2023-11-03 13:57:49 24 4
gpt4 key购买 nike

目前我在回调过程中有一个 For 循环:

private void InitializeComponent()
{

var timer = new System.Threading.Timer(TimerProc, null, 60000, 60000);

}

public void TimerProc(object state)
{

for (int i = 0; i <= 6; i++)
{
//Do something here
}

}

尽管我已将它设置为每 60000 毫秒重复一次,但 TimerProc 仅触发一次。看起来循环内的操作在第一次完成后不再执行。

但是,如果我删除 For 循环并执行其他一些操作,例如打印到控制台行或写入文本文件,则 TimerProc 会按预期重复。<​​/p>

为什么会这样,为什么回调过程中的循环会在初始触发后停止执行?

我已经通过使用 while(true) 无限循环并使用 Thread.Timer 在 x 毫秒后暂停进程来解决此问题。

我使用 while 循环的新代码如下所示:

private void InitializeComponent()
{

processthread = new Thread(new ThreadStart(DoSomething));
processthread.Start();

}

public void DoSomething()

{

while(true)
{
for (int i = 0; i <= 6; i++)
{
//do something here

}
Thread.Sleep(5000);
}

}

我只是想知道为什么System.Thread.Timer中的回调过程不能处理循环。

干杯,

斯坦利

最佳答案

从问题中包含的代码来看,看起来您没有在任何地方存储对timer 的引用。我可能是错的,但我的猜测是您没有看到重复的回调,因为计时器对象本身已被垃圾回收。将对计时器的引用分配给一个生命周期更长的变量(即一个字段),我敢打赌这将解决问题。

换句话说,我不认为 for 循环与您所看到的有任何关系(我不是在争论证据,只是提出这是巧合,没有别的) .

为了验证我的假设,我创建了以下非常简单的 Windows 窗体应用程序:

using System;
using System.Threading;
using System.Windows.Forms;

using Timer = System.Threading.Timer;

public class Program
{
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new TestForm());
}
}

class TestForm : Form
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
var timer = new Timer(TimerProc, null, 1000, 1000);
}

public void TimerProc(object state)
{
for (int i = 0; i <= 6; i++)
{
Console.WriteLine(DateTime.Now.ToLongTimeString());
}
}
}

我看到当前时间打印到控制台三十多秒;然后它停止了。

相比之下,以下更改似乎可以解决问题。

class TestForm : Form
{
// Note: declare a field to store a reference to the timer.
Timer timer;

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.timer = new Timer(TimerProc, null, 1000, 1000);
}

// ...
}

我在进行上述更改后再次启动程序,计时器继续计时了几分钟。

关于c# - System.Threading.Timer 中的回调过程中的 FOR 循环导致它仅触发一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11606332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com