怎么配置计时器?

时间:2009-12-29 22:05:51

标签: c# timer

如何正确处理System.Threading.Timer?

我得到了这个结果:

pub_MyEvent1
pub_MyEvent1
pub_MyEvent1

pub_MyEvent1
new pub_MyEvent
pub_MyEvent1
new pub_MyEvent

代码:

class Program
{
    static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        pub.MyEvent += new EventHandler(pub_MyEvent1);
        Console.ReadLine();
        pub = new Publisher();
        pub.MyEvent += new EventHandler(pub_MyEvent);
        Console.ReadLine();
    }
    static void pub_MyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("new pub_MyEvent");
    }
    static void pub_MyEvent1(object sender, EventArgs e)
    {
        Console.WriteLine("pub_MyEvent1");
    }
}

public class Publisher : IDisposable
{
    private System.Threading.Timer _timer;
    private EventHandler _myEvent;
    public event EventHandler MyEvent
    {
        add { _myEvent += value; }
        remove { _myEvent -= value; }
    }
    protected void OnMyEvent(Object state)
    {
        if (_myEvent != null)
        {
            foreach (EventHandler handler in _myEvent.GetInvocationList())
            {
                handler(this, new EventArgs());
            }
        }
    }
    public Publisher()
    {
        _timer = new System.Threading.Timer(new System.Threading.TimerCallback(OnMyEvent), null, 1000, 1000);
    }
    public void Dispose()
    {
        if (_timer != null)
            _timer.Dispose();
    }
}

2 个答案:

答案 0 :(得分:2)

您应该单独处理每个发布者。

static void Main(string[] args)  
{
  using (Publisher pub = new Publisher())  
  { 
    pub.MyEvent += new EventHandler(pub_MyEvent1); 
    Console.ReadLine(); 
  }  
  using (Publisher pub = new Publisher())  
  {
    pub.MyEvent += new EventHandler(pub_MyEvent); 
    Console.ReadLine();  
  }  
}

答案 1 :(得分:0)

您可以使用

using(Publisher pub = new Publisher();) 
{
    pub.MyEvent += new EventHandler(pub_MyEvent1);
    Console.ReadLine();
    pub = new Publisher();
    pub.MyEvent += new EventHandler(pub_MyEvent);
    Console.ReadLine();
}

pub.Dispose()之后调用Console.ReadLine();稍微安全一些,因为用户可以关闭应用程序而不是按Enter键。此外,如果发生任何异常,using语句将捕获异常,处理计时器并将异常重新抛回给您。