2012-04-14 5 views
0

Я использую агрегатор событий Prism в Silverlight, и мне трудно работать с подпиской. Когда код попадает в метод Subscribe, он просто зависает и никогда не переходит к следующей строке кода. Если я разбиваю код, _eventAggregator.GetEvent(), похоже, возвращает действительный экземпляр события. Код определенно зависает на «Подписаться». Что я могу делать неправильно? JobCompletedEvent объявлен в другой библиотеке (которая является зависимостью для этой библиотеки).Silverlight зависает от EventAggregator Prism. Способ подписки

public void CallMeWhenTheJobIsDone(Action callback) 
    { 
     if (_jobIsRunning) 
      _eventAggregator.GetEvent<JobCompletedEvent>().Subscribe((e) => callback(), ThreadOption.UIThread); 
     else 
      callback(); 
    } 

    public class JobCompletedEvent: Microsoft.Practices.Prism.Events.CompositePresentationEvent<JobCompleted> 
{ } 
public class JobCompleted 
{ 
} 
+0

Можете ли вы опубликовать код, используемый для публикации события, и пример метода обратного вызова, который вы используете? –

ответ

0

1) Почему вы используете if (_jobIsRunning) ?? Вы звоните callback в любой кейс.

2) Призма только принесет вам событие - и по вашему вопросу - Prism IS растет и проходит событие к вам - так это не Prism вопрос - кажется, что все, что называют callback не работает.

Таким образом, мы должны видеть больше на то, что называют callback и другое: в случае Prism вы называя callback на ThreadOption.UIThread ThreadPool так - дважды проверьте, если какой-либо другой поток уже блокировать поток пользовательского интерфейса, когда вы звоните callback

+0

Код, который я разместил без лишних сложностей, есть причины для проверки _jobIsRunning, но я должен был представить пример, который был больше к точке. Обратный вызов также не имеет значения (код никогда не доходит так далеко, я мог бы заменить его на() => {}, и я получаю ту же проблему). Я думаю, что у моего EventAggregator есть проблемы. Я собираюсь попробовать и отлаживать источник Prism, чтобы узнать, есть ли у меня какие-либо подсказки. – nicoleeschmidt

+0

Я беру это назад, put() => {} исправляет проблему – nicoleeschmidt

0

Моя проблема в том, что я не должен был использовать анонимный метод в моей подписке. Призма, похоже, не поддерживает его. Некоторые называют это ошибкой в ​​Prism, я согласен :) Вы не можете не использовать анонимный метод, но этот метод должен быть общедоступным.

Некоторые ссылки я нашел прибегая к помощи

http://greenicicleblog.com/2010/04/28/prism-event-aggregator-more-leaky-than-it-seems/

Execute same Prism Command from different ViewModels

Я подозреваю, что это в документации Prism где-то, я думаю, я просто дул им. Если я устанавливаю keepSubscriberReferenceAlice, он работает с частным методом или анонимным методом (что действительно имеет смысл теперь, когда я думаю об этом). Самое смешное, что в моем проекте sandbox я даже не могу скомпилировать анонимный метод, который использует частный код. Мой живой проект позволяет ему компилироваться, но не работает во время выполнения.

Edit: Да, это в документации http://msdn.microsoft.com/en-us/library/ff921122%28v=pandp.40%29.aspx Большой желтый ящик 2/3 пути вниз страницы.

Смежные вопросы