C#计时器问题

3

你好,我目前在开发一个程序时遇到了一个定时器问题。定时器运行并调用方法,在一段时间后从远程计算机中检索Windows管理信息并重复进行此操作。

第一次定时器调用时没有问题,但是第二次在定时器完成任务后,它再次循环自身,并且第三次运行时会执行3次等。以下代码中的for循环正常工作,问题出在定时器本身上。

所以如果有任何帮助,将不胜感激,如果您需要进一步的细节,请让我知道。

以下是我的代码:

private void tmrStore_Tick(object sender, EventArgs e)
    {
        string ipAdd;
        ipAdd = "127.0.0.1";
        List<TblServer> Server;

        WMIInfo localDB = new WMIInfo("Data Source=|DataDirectory|\\WMIInfo.sdf");

        Server = localDB.TblServer.ToList();

        if (Server.Count == 0)
        {

        }
        else
        {
            for (int counter = 0; counter < Server.Count; counter++)
            {
                CPUStore cpu = new CPUStore();
                cpu.Store(Server[counter].IpAdd);

                HDDStore hdd = new HDDStore();
                hdd.Store(Server[counter].IpAdd);

                MemStore mem = new MemStore();
                mem.Store(Server[counter].IpAdd);

                //delete items over 24 hours old 
            }
        }

表单中还有其他内容吗?您如何将tmrStore_Tick方法与事件连接起来? - Fredrik Mörk
什么是时间间隔?它与事件处理程序所需的时间相比如何? - H H
3个回答

3
尝试在执行管理任务之前禁用计时器,然后重新启用:
tmrStore.Enabled = false;
try{
    // do stuff
}finally{
    tmrStore.Enabled = true;
}

问题的原因可能是您的计时器处理程序的主体执行时间比您的 Timer.Ticks 值长,所以您的计时器事件开始堆叠在一起。
您也可以考虑将此代码放入线程中,而不是计时器中,这样它就不依赖于用户界面了。

1
问题的原因是什么,如何解决?很明显,问题不在他粘贴的代码中,这个答案看起来像是随意尝试,除非你确实有一个完美的解释,否则我道歉。 - IRBMe
1
如果代码执行时间比计时器的间隔时间长,那么这是一个完全可行的解决方案。 - Dmitry Brant
如果tick事件中的代码执行时间太长,以至于事件在另一个线程上再次触发,那么这可能会起作用。他正在调用远程计算机,这可能是一个缓慢的操作,可能比定时器的间隔时间更长。 - Magnus Lindhe

0

我的第一个猜测是您将 Timer.Tick 事件设置在多次执行的位置。我建议尝试搜索“tmrStore.Tick + =”,以查看所有方法都被添加到事件的地方。


-1

好的,我解决了这个问题,因为我有一个类用于将检索到的信息写入文本框,并在其中调用了一个新的表单实例以访问文本框。

感谢你们的帮助,我相信很快我会回来寻求更多帮助的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接