Windows Phone 7.1 中的 NullReferenceException 或绑定引用周期错误解读
原文发布于 2012 年 1 月 15 日(星期日)
我最近遇到了一个非常难诊断和修正的问题,我没发现其他任何地方阐述过该问题,因此我想我应该在这里阐述一下,以便其他人再次遇到时参考。在一个 Windows Phone 7.1(即 Mango)应用程序中,您添加了服务引用 — 我这里是一个 WCF 应用程序。我遇到的问题是创建 WCF 代理时通常会随机引发异常。我指的是这行代码:
MyService.MyClass foo = new MyService.MyClass("myConfigSettings");
它会引发一个异常。尽管这本来就很让人崩溃了,但更莫名其妙和令人沮丧的是它引发的异常往往不一样。它会引发下面这两个异常之一 — 至于什么时候引发哪个异常却毫无道理可言:
- NullReferenceException - 这里绝对没有详细信息,没有消息,没有内部异常,什么都没有。
- 在您的配置中检测到绑定引用周期。必须删除以下引用周期: basicHttpBinding/BasicHttpBinding_IMyAppInterface
关于这个问题,众多难解的疑虑之一是只有从应用程序启动期间运行的某段代码调用该方法时才会引发该异常;在其他任何时间调用该方法都没有任何问题。另外,如果跳过异常处理代码,然后将下一行执行代码重新拖到上面以创建代理实例,总是可行。另外还有其他一些真正奇怪的问题,解决它们时我取得了不同程度的成功,但最后让我醒悟的是,在应用程序启动代码中还执行了另一代码块,它也会创建该 WCF 代理的实例,却从未失败过。在试图弄明白为什么一个总是成功,一个经常失败时,最后我忽然想到看一下调用代码的方法。结果,我创建了两个不同的后台线程,每个运行不同的代码块。每个线程调用不同的方法(包含代码)来实例化 WCF 代理的实例。原来,这才是导致这个小问题的根源。通过重新配置代码,以便所有应用程序启动任务在一个后台线程上运行,奇怪的异常神奇地消失了。
当然,能够解决该问题纯属幸运(中间经历了很多次的尝试,遇到了大量的错误),所以我想我应该分享这一宝贵的小经验,以供您在面临类似的困境时参考。
这是一篇本地化的博客文章。请访问 Deciphering NullReferenceException or Binding Reference Cycle Errors in Windows Phone 7.1 以查看原文