2012-03-27 6 views
2

Ich arbeite mich durch verschiedene Open-Source-Projekte, um ein Gefühl dafür zu bekommen, wie Menschen das gleiche Problem auf unterschiedliche Weise angehen. Diesmal sind es Event-Aggregatoren, speziell Caliburn.Micros.Versuchen zu verstehen, wie dies auf dem UI-Thread aufgerufen wird

Ich bemerke, dass Rob sagte, dass, wenn kein Thread geliefert wird, der EA zum UI-Thread marshale. Die Linie spezifisch ist:

public static Action<System.Action> 
DefaultPublicationThreadMarshaller = action => action(); 

und dann weiter auf:

marshal(() => 
     { 
      *SNIP* 
     }); 

Was ich nicht verstehe sein, wie Sie das sagen kann, wird auf dem UI-Thread aufgerufen werden, werden alle Aktionen auf der angerufene UI-Thread, es sei denn, Sie geben einen nicht an? (Sie können angeben, welche Aktion btw genannt wird, die Zeile oben ist nur dann, wenn keine Aktion angegeben wird).

+0

Es gibt nichts, was dazu führen könnte, dass dies im UI-Thread aufgerufen wird. Der 'DefaultPublicationThreadMarshaller' ruft einfach die Aktion im aktuell laufenden Thread auf. Wo finden Sie die Erwähnung des UI-Threads genau? – Groo

+0

Es gibt kein solches automatisches Verhalten. Vielleicht ist es so, dass 'marshal()' entworfen und implementiert wird. –

Antwort

1

Aktion kann entweder in dem Thread aufgerufen werden, es nennt:

Action a =() => Foo(); 
a.Invoke(); 

Oder kann es asynchron

Action a =() => Foo(); 
a.BeginInvoke(); 

aufgerufen werden, wenn das Ereignis Aggregator es einen synchronen Aufruf zu verwenden, dann konfiguriert ist, ist möglich, dass das Ereignis im UI-Thread behandelt wird. Es ist jedoch sehr unwahrscheinlich, und normalerweise verwendet ein Ereignisaggregator die asynchrone Ausführung und die Aktion wird in einem Thread-Pool ausgeführt.

In dem fraglichen Code wird es einen Ort geben, an dem es (intern und nicht hier eingeschlossen) entweder Invoke oder BeginInvoke für die Aktion aufruft, hier liegt der Unterschied.

N.B. Diese Antwort bezieht sich nicht auf einen bestimmten Ereignisaggregator.