timer控件数组同时调用一个事件问题
timer控件数组同时调用一个事件时出现问题,当事件处理过程比较长时,下一个timer对时间的判断不能精确。导致需要触发的过程不能实现。不知道有没有高手给一下多timer处理多个任务的例子。我的代码如下:
foreach (Control c in this.panel1.Controls)--------------------编程问答-------------------- 你要做什么事 --------------------编程问答-------------------- 我要做,自定义创建timer数组,并且每个timer元素执行不同的任务。。 --------------------编程问答-------------------- 把你要做的事逻辑分清,哪个前,哪个后,哪些并发执行,要共同访问哪些变量,哪些地方会出现竞态条件
{
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()
{ //处理代码 时间有些比较长}
}
建议不要用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#