订阅后触发事件

时间:2013-03-25 13:57:54

标签: c# events timer event-handling

我有一个包含队列的表和一个包含列表框的表单。

当用户打开表单时,它会从队列中获取所有累积的对象,并在列表框中显示它们。一旦队列获得新项目,表单就会打开,它会通过自定义事件通知新项目的表单。

关闭表单后,数据将再次累积。

我的问题如下:一旦表单订阅了通知事件,它应该将所有队列转储到表单,并且只要有人订阅了该事件就继续转储它。 它不应该等到另一个项目添加到队列中。

一种解决方案是使用计时器检查是否有对该事件的任何订阅然后将其转储。它并不多,但我会浪费资源与计时器。

如果表单对事件的订阅本身可以触发事件,那似乎会更好。该应用程序非常模块化,模块通过事件与eventNexus进行通信,然后nexus会通知所有需要知道的人。

由于事件也是一个对象,应该可以完成这样的事情,但我没有找到任何链接。

2 个答案:

答案 0 :(得分:3)

您可以使用addremove语句自定义在事件代码中添加和删除事件处理程序:

private EventHandler onMyEvent;
public event MyEventHandler MyEvent
{
    add
    {
        // run when event handler is added ( += )
        onMyEvent = (MyEventHandler)Delegate.Combine(onMyEvent, value);

        // Add additional, custom logic here...
    }

    remove
    {
        // run when event handler is removed ( -= )
        onMyEvent = (MyEventHandler)Delegate.Remove(onMyEvent, value);
    }
}

在这里,您可以添加自己的代码,以便在添加或删除事件处理程序时触发操作。

答案 1 :(得分:0)

对于计时器,您可以尝试使用此代码

    private static System.Timers.Timer aTimer;

    aTimer = new System.Timers.Timer(10000);

    // Hook up the Elapsed event for the timer.
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    // Set the Interval to 2 seconds (2000 milliseconds).
    aTimer.Interval = 2000;
    aTimer.Enabled = true;

你的功能

    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        //Your treatment
    }