Silverlight挂在Prism的EventAggregator订阅方法
我在Silverlight中使用Prism的事件聚合器,并且在订阅时遇到困难。当代码击中Subscribe方法时,它就会挂起并且永远不会进入下一行代码。如果我分解代码,_eventAggregator.GetEvent()似乎返回一个有效的事件实例。代码绝对挂在“订阅”上。我在这里做错了什么? JobCompletedEvent在另一个库(这是该库的依赖项)中声明。Silverlight挂在Prism的EventAggregator订阅方法
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
{
}
1)为什么你使用if (_jobIsRunning)
?您在任何的情况下致电callback
。
2)棱镜只会给你带来的事件 - 并根据你的问题 - 棱镜IS上升和传递事件给你 - 所以它不是一个棱镜的问题 - 似乎,无论通过callback
称为是行不通的。
所以我们需要看到更多关于什么是所谓的callback
和另一件事:在棱镜情况下,你调用callback
上ThreadOption.UIThread
线程池等等 - 仔细检查是否有其他线程已经锁定UI线程,当你调用callback
我发布的代码不必要的复杂,有_jobIsRunning检查的原因,但我应该提供一个更多的示例到了这一点。回调也是不相关的(代码永远不会那么远,我可以用()=> {}替换它,并且我得到相同的问题)。我认为我的EventAggregator有问题。我将尝试使用Prism源码进行调试,以查看是否有任何线索。 – nicoleeschmidt 2012-04-15 20:21:59
我回过头来,把()=> {}修复了这个问题 – nicoleeschmidt 2012-04-15 22:27:10
我的问题是我不应该在我的订阅中使用匿名方法。棱镜似乎不支持它。有些人称这是一个Prism中的错误,我同意:)你不仅可以不使用匿名方法,但方法必须是公开的。
一些参考文献,我发现谷歌搜索
http://greenicicleblog.com/2010/04/28/prism-event-aggregator-more-leaky-than-it-seems/
Execute same Prism Command from different ViewModels
我怀疑这是在棱镜文档的某个地方,我想我只是吹通过它。如果我设置keepSubscriberReferenceAlice,它可以与私有方法或匿名方法一起工作(现在我已经考虑到了这一点)。有趣的是,在我的沙箱项目中,我甚至无法编译使用私有作用域代码的匿名方法。我的活动项目允许它编译但在运行时失败。
编辑: 是的,它是在文档 http://msdn.microsoft.com/en-us/library/ff921122%28v=pandp.40%29.aspx 大黄色框的方式下跌的一页2/3。
您能否请张贴用于发布事件的代码和您正在使用的回调方法的示例 – 2012-04-16 12:31:11