当前位置:编程学习 > C#/ASP.NET >>

timer控件数组同时调用一个事件问题

timer控件数组同时调用一个事件时出现问题,当事件处理过程比较长时,下一个timer对时间的判断不能精确。导致需要触发的过程不能实现。不知道有没有高手给一下多timer处理多个任务的例子。
我的代码如下:
foreach (Control c in this.panel1.Controls)
            {
                if (c is TextBox)
                { count++; }
            }
            

            for (int i = 0; i <count; i++)
            {

                System.Timers.Timer[] timer = new System.Timers.Timer[count];
                timer[i] = new System.Timers.Timer();
                timer[i].Interval = 1000;
                timer[i].AutoReset = true;
               timer[i].Elapsed+=new System.Timers.ElapsedEventHandler(Timers_Elapsed);
               timer[i].Start();
}
private void Timers_Elapsed(object sender, EventArgs e)
        {
            string settime = "";
            int sumcount = 0;
            string nowtime=System.DateTime.Now.ToString("HH:mm:ss");
            System.Timers.Timer theTimer = (System.Timers.Timer)sender;
            sumcount++;
            this.textBox1.Text =sumcount.ToString();
             for()
              { //处理代码 时间有些比较长}
}
--------------------编程问答-------------------- 你要做什么事 --------------------编程问答-------------------- 我要做,自定义创建timer数组,并且每个timer元素执行不同的任务。。 --------------------编程问答-------------------- 把你要做的事逻辑分清,哪个前,哪个后,哪些并发执行,要共同访问哪些变量,哪些地方会出现竞态条件

建议不要用Forms.Timer,,,这个Timer不靠谱,并且不是异步执行的好像,非主线程改变Enable属性还没有效果 --------------------编程问答-------------------- 楼上的wangsunjun,我没有用Forms.Timer ,我用的是System.Timers.Timer[] timer 
首先,我读取一个XML文件 ,XML文件里有settime节点 和URL节点,  URL节点值加载到panel1里的动态生成textBox控件数组里。URL赋值给texbox[i].text
然后根据加载XML文件 的个数,创建 timer 数组,,判断当前时间是否等于settime节点时间,如果相等,就执行相对的操作。 --------------------编程问答-------------------- 你要创建Timer做什么 --------------------编程问答-------------------- 然后根据加载XML文件 的个数,创建 timer 数组,,判断当前时间是否等于settime节点时间

这个为什么要创建timer数组呢?
XML文件也是动态刷新的?文件的个数不定的?
这样处理不是好办法啊!! --------------------编程问答-------------------- 对啊,你的Timer要定时处理什么操作? --------------------编程问答-------------------- 我创建timer数组,是为了满足时间条件,当时时间是否等于XMl里的settime的节点值,满足打开执行文件就可以了。楼上的朋友,你有什么好方法吗?加载XMl文件的个数也 是动态的。 --------------------编程问答-------------------- 建议看一下多线程,只用timer控件不太妥当 --------------------编程问答-------------------- 学习下多线程的知识再去写吧,你的思路很乱
处理动态文件?你的文件是怎么生成的?要对文件里的数据怎么操作?操作完成后释放还是放一部分数据在变量里?
感觉你的需求挺复杂,理解下多线程再写吧 --------------------编程问答--------------------  
楼上的wangsunjun
你没有必要实现我所有的功能呀,我就问一下多个timer并发事件问题呀,你扯远了吧,XML生成和读取我这边一点问题都没有。
--------------------编程问答-------------------- 我想说的也就是Timer这东西,不太好用,对于要处理多个东西的时候,特别是你说的还用Timer数组,更容易出现错误,所以要明白你要用Timer做什么.一般不会用Timer去处理你说的那个需求的.
--------------------编程问答-------------------- Timer一般都单独拿来做一件重复的事情,涉及到多线程的东西 --------------------编程问答-------------------- 请问 一下,我有多个时间条件,满足一条,执行一个文件,有什么样的控件加流程思路比较发了。求教了。 --------------------编程问答-------------------- 循环写的有问题,定义timer拿到for之前 --------------------编程问答-------------------- java中有synchronized同步函数概念,不过c#中好像没有对函数的同步修饰。
只能对变量进行同步,lock,Monitor都可以使用。 --------------------编程问答-------------------- 你可以参考这篇帖子吧,这篇帖子里面我有给过例子的,跟你这个应该算同一类问题
http://topic.csdn.net/u/20120528/10/80f847f8-899a-452f-b8b2-184a9cab650a.html --------------------编程问答--------------------

类似的场景有两种:        
一种是每隔一段时间执行一次某个操作。
另一种是执行一次操作后,间隔一段时间再执行下一次操作。
第一种场景使用timer较佳,而第二种情况推荐使用
while(true)
{
    //DoSomething
    Thread.Sleep(100);
}
示例:
一、使用timer
private System.Threading.Timer _timer = null;//这个要使用个全局变量,代码不好看
private void StartMyWork()
{
    _timer = new Timer(MyMethod, null, 0, 100);
}
private void MyMethod(object obj)
{
     /*DoSomething*/
   //如果在timer里面需要更新UI控件的话,由于这个timer不是在主线程中执行的因此要这样访问:
   this.Dispatcher.BeginInvoke(
       new Action(
       () =>
       {
           //这样更新UI
       }));
}
二、使用死循环
private void StartMyWork()
{
    Action loopAction = MyMethod;
    loopAction.BeginInvoke(null,null);
}
private void MyMethod()
{
    while(true)
    {
        //DoSomething
        Thread.Sleep(100);
    }
}
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,