如何正确处理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();
}
}
答案 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语句将捕获异常,处理计时器并将异常重新抛回给您。