2016-05-30 17 views
0

Ich habe ein Ausgabefenster erstellt, in dem mehrere Ereignisse mit Prism EventAggregator abonniert werden. Bisher ist der Konstruktor ist der Umgang mit zwei verschiedenen Veranstaltungen:C# Delegat zweimal angerufen?

public OutputWindowView(IEventAggregator eventAggregator) 
{ 
    eventAggregator.GetEvent<LoginStatusEvent>().Subscribe(trackLogin, true); 
    eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, true); 

    this.InitializeComponent(); 
} 

Beide Veranstaltungen zielen auf die gleiche UI-Komponente über SetText Methode:

private void trackLogin(LoginStatus s) 
{ 
    SetText("Connected: " + s.IsConnected.ToString()); 
} 

private void trackMessage(string s) 
{ 
    SetText(s); 
} 

ich einen Delegierten zu schaffen versuche Thread Fehler zu vermeiden.

private delegate void SetOutputText(string content); 

private void SetText(string content) 
{ 

    Trace.WriteLine("===== SetText ====="); 

    var text = content + Environment.NewLine; 

    if (this.txtOutput.Dispatcher.CheckAccess() == false) 
    { 
     Trace.WriteLine("->CheckAccess > false"); 
     SetOutputText _output = new SetOutputText(SetText); 
     this.Dispatcher.Invoke(_output, text); 
    } 
    else 
    { 
     Trace.WriteLine("->CheckAccess > true"); 
     this.txtOutput.Text += text; 
    } 

} 

Der Ausgang Hover ist:

===== SetText ===== 
->CheckAccess > false 
===== SetText ===== 
->CheckAccess > true 

Ich würde die Ausgabe erwarten zu sein:

===== SetText ===== 
->CheckAccess > false 

ODER

===== SetText ===== 
->CheckAccess > true 

aber es scheint, zweimal aufgerufen werden.

Antwort

1

Sie können auf dem UI-Thread abonnieren, indem ThreadOption.UIThread wie diese

eventAggregator.GetEvent<ConsoleMessageEvent>().Subscribe(trackMessage, ThreadOption.UIThread, true); 

oder noch einfacher, bindet an eine Eigenschaft auf Ihrem Viewmodel vorbei und du bist fertig, weil INotifyPropertyChanged Ereignisse automatisch an den UI-Thread gemarshallt werden .

+0

Danke, können Sie auf Ihren zweiten Punkt über das Abwarten zu einer Eigenschaft erweitern? Ich bin neu in C#. – keeg

+0

Normalerweise haben Sie, besonders im Kontext von prism, eine Ansicht mit einem Ansichtsmodell als Datenkontext, und das Ansichtsmodell implementiert 'INotifyPropertyChanged' (durch Ableiten von' BindableBase' im Prisma) und Sie können Eigenschaften im Ansichtsmodell ändern aus irgendeinem Thread und die Ansicht wird entsprechend aktualisiert. Zu viel für einen Kommentar hier, nehme ich an, Sie google für wpf Datenbindung, mvvm, schauen Sie sich die prism examples Dokumentation an, um die Konzepte kennenzulernen. – Haukinger