Silverlight依赖于Prism的EventAggregator订阅方法

时间:2012-04-14 23:33:19

标签: silverlight prism eventaggregator

我在Silverlight中使用Prism的事件聚合器,并且在订阅时遇到了困难。当代码点击订阅方法时,它就会挂起并且永远不会进入下一行代码。如果我分解代码,_eventAggregator.GetEvent()似乎返回一个有效的事件实例。代码肯定挂在“订阅”上。我在这里做错了什么? JobCompletedEvent在另一个库中声明(这是该库的依赖项)。

    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
{
}

2 个答案:

答案 0 :(得分:0)

1)为什么你使用if (_jobIsRunning)?您在任何案例中调用callback

2)棱镜只会带给你一个事件 - 并且根据你的问题 - 棱镜 IS 上升并将事件传递给你 - 所以这不是一个棱镜问题 - 似乎无论是什么叫{ {1}}无效。

所以我们需要更多地了解callback所调用的内容和另一件事:在Prism的情况下,你在callback ThreadPool上调用callback所以 - 仔细检查是否已有任何其他线程在调用ThreadOption.UIThread

时锁定UI线程

答案 1 :(得分:0)

我的问题是我不应该在订阅中使用匿名方法。棱镜似乎不支持它。有些人称这是Prism中的一个错误,我同意:)你不仅不能使用匿名方法,而且方法必须公开。

我发现谷歌搜索的一些参考资料

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

Execute same Prism Command from different ViewModels

我怀疑这是在Prism docs的某个地方,我想我只是吹了它。如果我设置了keepSubscriberReferenceAlice,它可以使用私有方法或匿名方法(现在我考虑一下它确实有意义)。有趣的是,在我的沙箱项目中,我甚至无法使用匿名方法进行编译,该方法使用私有范围的代码。我的实时项目允许它编译但在运行时失败。

编辑: 是的,它在文档中 http://msdn.microsoft.com/en-us/library/ff921122%28v=pandp.40%29.aspx 在页面下方的2/3大黄色框。