Попытка понять, как это вызывается в потоке пользовательского интерфейса - PullRequest
2 голосов
/ 28 марта 2012

Я пробираюсь через различные проекты с открытым исходным кодом, чтобы понять, как люди по-разному подходят к одной и той же проблеме.На этот раз это агрегаторы событий, в частности, Caliburn.Micro.

Я заметил, что Роб сказал, что если не будет предоставлен поток, советник будет маршалировать в поток пользовательского интерфейса.В частности, строка:

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

, а затем далее:

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

Что я не понимаю, как он может сказать, что это будет вызвано в потоке пользовательского интерфейса, вседействия, вызываемые в потоке пользовательского интерфейса, если вы не укажете тот, который не?(Вы можете указать, какое действие называется btw, приведенная выше строка указана только в том случае, если действие не указано).

1 Ответ

1 голос
/ 28 марта 2012

Действие может быть вызвано либо в потоке, который его вызывает:

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

Или он может быть вызван асинхронно

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

Если агрегатор событий настроен на использование синхронного вызова, то возможно, что событие обрабатывается в потоке пользовательского интерфейса. Однако это маловероятно, и обычно агрегатор событий использует асинхронное выполнение, а действие выполняется в пуле потоков.

В рассматриваемом коде будет место, где он (внутренне и не включенный здесь) вызывает в действии либо Invoke, либо BeginInvoke, в этом и заключается разница.

N.B. Этот ответ не является специфическим для какого-либо конкретного агрегатора событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...