【发布时间】:2019-03-10 10:09:39
【问题描述】:
考虑下面的例子。此示例有一个简单的事件源 (Ticker) 和一个通过更新表单标题的委托订阅其事件 (Ticked) 的表单。为简单起见,此示例只有一个事件,但请考虑多个表单订阅的大量事件的情况。
using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms;
namespace ConsoleApp3
{
class Program
{
// event cannot be used as a key type
// Dictionary<event, List<EventHandler>> subscriptions = new Dictionary<event, List<EventHandler>>();
static void Main(string[] args)
{
Ticker ticker = new Ticker();
Form form = new Form();
form.Show();
EventHandler eventHandler = new EventHandler((s, e) => {
form.Invoke(new Action(() => { form.Text = DateTime.Now.ToString(); }));
});
// save a reference to the event and the delegate to be added
//if (!subscriptions.ContainsKey(ticker.Ticked))
// subscriptions.Add(ticker.Ticked, new List<EventHandler>());
//subscriptions[ticker.Ticked].Add(eventHandler);
//form.FormClosing += (s, e) => {
// foreach (KeyValuePair<event, List<EventHandler>> subscription in subscriptions)
// foreach (EventHandler eventHandler in subscription.Value)
// subscription.Key -= eventHandler;
//};
//finally subscribe to the event(s)
ticker.Ticked += eventHandler;
Application.Run();
}
class Ticker
{
public event EventHandler Ticked;
public Ticker()
{
new Thread(new ThreadStart(() => {
while (true)
{
Ticked?.Invoke(null, null);
Thread.Sleep(1000);
}
})).Start();
}
}
}
}
如何将表单订阅的事件和表单添加到每个事件的委托保存在集合中,以便在关闭表单之前将其删除?
【问题讨论】:
标签: c# events delegates event-handling eventhandler