C# EventAggregator延迟消息以供以后使用

C# EventAggregator延迟消息以供以后使用,c#,prism,eventaggregator,C#,Prism,Eventaggregator,我非常喜欢Prism的EventAggregator为我提供的松散耦合类的功能。但是现在我遇到了一个EventAggregator没有解决的问题 因此,让我们假设我发布了消息“Test”,并且目前没有该消息的订户。有没有可能推迟到有订户的时候 这很容易实现。定义稍后将发布的第二条消息以及包含该消息和计时器的类: public class OriginalMessage : CompositePresentationEvent<OriginalArgs> { } public clas

我非常喜欢Prism的EventAggregator为我提供的松散耦合类的功能。但是现在我遇到了一个EventAggregator没有解决的问题

因此,让我们假设我发布了消息“Test”,并且目前没有该消息的订户。有没有可能推迟到有订户的时候


这很容易实现。定义稍后将发布的第二条消息以及包含该消息和计时器的类:

public class OriginalMessage : CompositePresentationEvent<OriginalArgs> { }
public class MyDelayedMessage : CompositePresentationEvent<MyEventArgs> { }

public class DelayedMessage {
    EventAggregator _bus;
    OriginalMessage _msg;
    DispatcherTimer _timer;
    OriginalArgs _args;

    public DelayedMessage(
        EventAggregator bus,
        OriginalMessage sourceMessage,
        OriginalArgs args,
        TimeSpan delay
    ) {
        _bus = bus;
        _args = args;
        _msg = sourceMessage;
        _timer = new DispatcherTimer();
        _timer.Interval = delay;
        _timer.Tick += OnTimerTick;
    }

    void OnTimerTick(object sender, EventArgs args) {

        _bus.GetEvent<MyDelayedMessage>().Publish(_args);
    }
}
公共类原始消息:CompositePresentationEvent{}
公共类MyDelayedMessage:CompositePresentationEvent{}
公共类延迟消息{
事件聚合器总线;
原始信息;
调度定时器;
原始args _args;
公共延迟消息(
事件聚合器总线,
原始消息源消息,
原始args args,
时间间隔延迟
) {
_总线=总线;
_args=args;
_msg=源消息;
_计时器=新调度程序();
_时间间隔=延迟;
_timer.Tick+=OnTimerTick;
}
void OnTimerTick(对象发送方、事件args args){
_bus.GetEvent().Publish(_args);
}
}

您将需要一个上下文来放置此对象以使其保持不变。您可以将其作为专用字段放到主机IU容器中。

非常好,谢谢。还有一个问题:如果我将计时器间隔设置为1秒,是否存在性能问题?当订户可用时,一个只“唤醒”订户的解决方案会更节省资源吗?除非您正在进行繁重的处理,否则用户不太可能注意到。但是,如果在创建侦听器之前有一段未知的时间,或者可能从来没有侦听器,那么您肯定应该将正在设置的侦听器与正在执行的工作负载(基于标志?)相耦合,而不是1秒的重新发布。