3

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

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

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

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

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

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

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

4

2 回答 2

6

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

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);
    }
}

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

于 2013-03-25T14:12:26.660 回答
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
    }
于 2013-03-25T14:03:12.403 回答