Timer处理多线程并发,避免死锁

来源:互联网 发布:单片机 二维码打印 编辑:程序博客网 时间:2024/05/16 09:52

C# Timer用法有哪些呢?我们在使用C# Timer时都会有自己的一些总结,那么这里向你介绍3种方法,希望对你了解和学习C# Timer使用的方法有所帮助。

关于C# Timer类  在C#里关于定时器类就有3个

C# Timer使用的方法1.定义在System.Windows.Forms里

C# Timer使用的方法2.定义在System.Threading.Timer类里  "

C# Timer使用的方法3.定义在System.Timers.Timer类里

下面我们来具体看看这3种C# Timer用法的解释:

◆System.Windows.Forms.Timer

应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API  SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console  Application(控制台应用程序)无法使用。   

◆System.Timers.Timer

和System.Threading.Timer非常类似,它们是通过.NET  Thread  Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。

◆System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。

C# Timer用法实例

使用System.Timers.Timer类

  1. System.Timers.Timer t =   
  2. new System.Timers.Timer(10000);  
  3. //实例化Timer类,设置间隔时间为10000毫秒;   
  4. t.Elapsed +=   
  5. new System.Timers.ElapsedEventHandler(theout);  
  6. //到达时间的时候执行事件;   
  7. t.AutoReset = true;  
  8. //设置是执行一次(false)还是一直执行(true);   
  9. t.Enabled = true;  
  10. //是否执行System.Timers.Timer.Elapsed事件;   
  11.  
  12. public void theout(  
  13. object source,   
  14. System.Timers.ElapsedEventArgs e)   
  15.  {   
  16.     MessageBox.Show("OK!");   
  17.  }  

相对于上述方法对于弹消息框等一些简单的操作不会出现问题,但是相对于一些复杂的操作,有可能会出现死锁。现对于该问题提供一个解决方案:

public void theout(object source, System.Timers.ElapsedEventArgs e)
        {

                   FormShow(strMessage);//Timer事件所要处理的事情

          }

private delegate void _FormShow(string strMessage);
        private void FormShow(string strMessage)
        {
            if (this.InvokeRequired)//避免死锁
            {
                _FormShow fmshow = delegate(string s)
                {
                    MessageShow me = new MessageShow(strMessage);
                    me.Show(this);
                };
                this.Invoke(fmshow, strMessage);
            }
            else
            {
                MessageShow me = new MessageShow(strMessage);
                me.Show(this);
            }
        }

运用上述方法处理多线程并发,避免死锁。

0 0
原创粉丝点击