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

关于Winform的Timer控件问题

请问Timer 控件是多线程的吗??

比如我设置Timer 每 10秒执行一个事件,如果 单个事件 10秒内执行不完,那 10秒后,程序还会在进入吗???

--------------------编程问答-------------------- Timer 在winform下有3个,其中就有一个线程Timer 
至于10秒后,程序还会不会进入
就要你自己的逻辑判断了,
可以选择进入,也可以阻塞不进入 --------------------编程问答--------------------
引用 1 楼  的回复:
Timer 在winform下有3个,其中就有一个线程Timer 
至于10秒后,程序还会不会进入
就要你自己的逻辑判断了,
可以选择进入,也可以阻塞不进入

3个是指什么意思?如何选择阻塞不进入?求指教 --------------------编程问答-------------------- 会出现事件的重入

办法:

Timer.AutoReset = false;
....

时间触发函数:

try
{
Timer.Stop();

你自己的业务
}
catch{}
finally
{
Timer.Start();
}
这样保证在你业务没有处理完毕前,定时器不会重启 --------------------编程问答-------------------- 等上一次完成后才进入下一次,如果超时了,就超时执行 --------------------编程问答--------------------
设个状态标志,private bool finished=true;

Timer的那个事件中:
if(finished)
{
finished=false;
//do your sth.
finished=true;
} --------------------编程问答-------------------- 不是多线程的。 --------------------编程问答--------------------
 static void Main(string[] args)
        {
            System.Threading.Timer timer = new Timer(A,null,0,500);
}

private static void A(object o)
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId );
            Thread.Sleep(3000);
}

这样你可以看到Write了不同的线程Id。System.Threading.Timer 这个Timer是多线程的。如果当前在工作的那个A还没结束就会开新线程。 --------------------编程问答-------------------- 这种问题试下就知道了。 --------------------编程问答--------------------
引用 2 楼  的回复:
引用 1 楼 的回复:

3个是指什么意思?如何选择阻塞不进入?求指教

http://www.cnblogs.com/shang20017/archive/2009/03/16/1413798.html --------------------编程问答-------------------- 如果执行不完的话就不会再去进入的,因为它只会按照你设定的时间去执行,不会管是否执行完了······ --------------------编程问答--------------------
引用 5 楼  的回复:
设个状态标志,private bool finished=true;

Timer的那个事件中:
if(finished)
{
finished=false;
//do your sth.
finished=true;
}


似乎需要加lock和异常俘获机制更安全些个
lock(Timer)
{
if(finished)
{
finished=false;
try
{
//do your sth.
}
catch{}
finally
{
finished=true;
}
}
}

--------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,