Windows Phone 7.1 における NullReferenceException エラーまたは バインド参照サイクル エラーの解読

原文の記事の投稿日: 2012 年 1 月 15 日 (日曜日)

私は、最近、診断と解決が非常に困難な問題に突き当たりました。私は、この問題についてあらゆる場所を探しましたが、何も見つけることができませんでした。したがって、他のユーザーがこの問題に再び直面したときのために、ここにこの問題について書くことを思い立ちました。Windows Phone 7.1 (つまり、Mango) アプリケーションにはサービス参照があります (私の場合は WCF アプリケーション)。私が見ていたものは、その WCF アプリケーションが例外を頻繁かつランダムにスローして、単に WCF プロキシを作成することでした。具体的には、次のコード行です。

MyService.MyClass foo = new MyService.MyClass("myConfigSettings");

このコードが例外をスローするのです。これはもともと突拍子もないことですが、さらに私の頭を悩ませたことは、このコードがスローする例外が常に同じとは限らないことでした。このコードは、以下の 2 つの例外のどちらかをスローしましたが、いつどちらの例外をスローするかに関して理解できませんでした。

  • NullReferenceException - 詳細、メッセージ、内部例外などは一切ありません。
  • バインド参照サイクルが構成内で検出されました。次の参照サイクルを削除する必要があります: basicHttpBinding/BasicHttpBinding_IMyAppInterface

この問題に関する (多くの) おかしな現象の 1 つは、アプリケーションの起動時に実行された一部のコードからメソッドが呼び出された場合にのみ例外がスローされることでした。しかし、別の時間にそのメソッドを呼び出しても問題は発生しません。また、単に、例外処理コードを通過させて、次の実行行に戻ってプロキシ インスタンスを作成した場合も、処理は常に正常に実行されました。ほかにも、成功の度合いが異なる本当に不思議で奇妙なことがありましたが、最終的に何かをほのめかしてくれる事実がアプリケーション起動コードの中にありました。実行された別のコードがあったのです。そのコードでもその WCF プロキシのインスタンスが作成されていました。そして、そのコードがエラーになることは一切ありませんでした。一方が常に成功し、一方が頻繁に失敗する理由を見つけ出す上で、コードがどのように呼び出されていたかについて調べることにしました。結局のところ、私には、作成される 2 つの異なるバックグラウンド スレッドがあり、各スレッドで異なるコードが実行されていました。各スレッドでは、WCF プロキシのインスタンスをインスタンス化するコードが含まれた異なるメソッドが呼び出されていました。結局、これが崩壊の始まりであり、この小さな問題の原因でした。すべてのアプリケーション起動タスクを 1 つのバックグラウンド スレッドで実行するようにコードを再構成すると、この奇妙な例外は魔法のように消えてなくなりました。

数多くの試行錯誤を繰り返した中で、この原因を見つけたのはもちろん単なる偶然でした。したがって、他の技術者がこれと似た苦境に置かれたときのために、このささいなことを共有しようと考えました。

これはローカライズされたブログ投稿です。原文の記事は、「Deciphering NullReferenceException or Binding Reference Cycle Errors in Windows Phone 7.1」をご覧ください。