2013-09-03 4 views
0

프리즘의 EventAggregator 기능을 사용하면 클래스를 느슨하게 결합 할 수 있습니다. 하지만 지금은 EventAggregator에서 다루지 않는 문제가 있습니다.EventAggregator 나중에 사용하기 위해 메시지를 연기

그래서 "Test"라는 메시지를 게시하고이 메시지의 구독자가 없다고 가정합니다. 구독자가있을 때까지 연기 할 수 있습니까?

감사합니다.

답변

1

구현하기가 쉽습니다. 나중에 발표 될 두 번째 메시지와 메시지를 포함하는 클래스와 타이머를 정의합니다

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

당신은 주위를 유지하기 위해이 객체를 배치하는 컨텍스트가 필요합니다. 호스트 IU 컨테이너에 개인 필드로 드롭 할 수 있습니다.

+0

정말 감사합니다. 한가지 더 질문 : 타이머 간격을 1 초로 설정하면 성능 문제가 있습니까? 구독자가있을 때 리소스를 "깨우는"솔루션 만 더 많은 리소스를 사용할 수 있습니까? – user2653422

+1

무거운 처리를하지 않는 한 사용자에게 눈에 띄지 않습니다. 그러나 청취자가 작성되기 전에 알 수없는 시간이 있거나 청취자가 없을 수도있는 경우, 1 초간의 재 공개보다는 수행중인 작업 부하 (플래그에 따라)로 설정된 청취자를 확실히 연결해야합니다. – bland

관련 문제