我在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
{
}
答案 0 :(得分:0)
1)为什么你使用if (_jobIsRunning)
?您在任何案例中调用callback
。
2)棱镜只会带给你一个事件 - 并且根据你的问题 - 棱镜 IS 上升并将事件传递给你 - 所以这不是一个棱镜问题 - 似乎无论是什么叫{ {1}}无效。
所以我们需要更多地了解callback
所调用的内容和另一件事:在Prism的情况下,你在callback
ThreadPool上调用callback
所以 - 仔细检查是否已有任何其他线程在调用ThreadOption.UIThread
答案 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大黄色框。