0

我在 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
{
}
4

2 回答 2

0

1)你为什么使用if (_jobIsRunning)无论如何你打电话callback

2)棱镜只会给你带来事件 - 根据你的问题 - 棱镜正在上升并将事件传递给你 - 所以这不是棱镜问题 - 似乎任何调用的callback方法都不起作用。

因此,我们需要了解更多关于调用的内容callback和另一件事:在 Prism 情况下,您调用callbackon ThreadOption.UIThreadThreadPool 所以 - 在您调用时仔细检查是否有任何其他线程已经锁定了 UI 线程callback

于 2012-04-15T13:50:38.193 回答
0

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

我在谷歌上找到了一些参考资料

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

从不同的 ViewModel 执行相同的 Prism 命令

我怀疑这是在某个地方的 Prism 文档中,我想我只是被它吹走了。如果我设置 keepSubscriberReferenceAlice ,它可以与私有方法或匿名方法一起使用(现在我想这确实有点道理)。有趣的是,在我的沙盒项目中,我什至无法使用使用私有范围代码的匿名方法进行编译。我的实时项目允许它编译但在运行时失败。

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

于 2012-04-15T22:29:23.600 回答