【问题标题】:Silverlight hangs on Prism's EventAggregator Subscribe methodSilverlight 挂在 Prism 的 EventAggregator 订阅方法上
【发布时间】:2012-04-14 23:33:19
【问题描述】:

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

【问题讨论】:

  • 能否请您发布用于发布事件的代码以及您正在使用的回调方法示例

标签: silverlight prism eventaggregator


【解决方案1】:

1) 你为什么使用if (_jobIsRunning) ??您在任何情况下都调用callback

2) Prism 只会为您带来事件 - 根据您的问题 - Prism IS 上升并将事件传递给您 - 所以这不是 Prism 问题 - 似乎@ 987654323@ 不工作。

所以我们需要了解更多关于 callback 调用的内容和另一件事:在 Prism 情况下,您在 ThreadOption.UIThread ThreadPool 上调用 callback 所以 - 仔细检查是否有任何其他线程在您锁定 UI 线程时打电话给callback

【讨论】:

  • 我发布的代码过于复杂,_jobIsRunning 检查是有原因的,但我应该提供一个更重要的例子。回调也无关紧要(代码永远不会走那么远,我可以用 ()=>{} 替换它,我会遇到同样的问题)。我认为我的 EventAggregator 有问题。我将尝试使用 Prism 源进行调试,看看是否有任何线索。
  • 我收回了,把 ()=>{} 解决了问题
【解决方案2】:

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

我在谷歌上搜索到的一些参考资料

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

Execute same Prism Command from different ViewModels

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2012-06-30
    • 1970-01-01
    • 2021-03-01
    相关资源
    最近更新 更多