Freigeben über


Entschlüsseln von NullReferenceException- oder Bindungsverweiszyklus-Fehlern in Windows Phone 7.1

Veröffentlichung des Originalartikels: 15.01.2012

I bin kürzlich auf ein sehr schwer zu diagnostizierendes und zu behebendes Problem gestoßen und da ich es nirgends anders gefunden habe, möchte ich es hier beschreiben. Eine Anwendung für Windows Phone 7.1 („Mango“) enthält einen Dienstverweis – in meinem Fall eine WCF-Anwendung. Ich habe festgestellt, dass häufig, aber zufällig beim Erstellen des WCF-Proxys eine Ausnahme ausgelöst wird. Ich meine damit, dass folgende Codezeile:

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

eine Ausnahme auslöst. Das ist an sich schon verrückt, aber was daran verwirrend und frustrierend war ist, dass es nicht immer dieselbe Ausnahme war. Es wird eine der folgenden Ausnahmen ausgelöst – völlig unklar, welche wann ausgelöst wird:

  • „NullReferenceException“ – keinerlei Details, keine Meldung, keine innere Ausnahme, nichts.
  • „In der Konfiguration wurde ein Bindungsverweiszyklus entdeckt. Der folgende Verweiszyklus muss entfernt werden: basicHttpBinding/BasicHttpBinding_IMyAppInterface“

Besonders verrückt daran ist (unter anderem), dass die Ausnahme nur ausgelöst wird, wenn die Methode von Code aufgerufen wird, der beim Start der Anwendung ausgeführt wird; wenn ich die Methode sonst aufrufe, gibt es kein Problem. Auch wenn Sie nur den Ausnahmebehandlungscode durchlaufen und die nächste Zeile der Ausführung zurück nach oben ziehen, um die Proxyinstanz zu erstellen, funktioniert es. Es sind noch andere wirklich seltsame Dinge mit mehr oder weniger Erfolg passiert. Aber was mir schließlich den entscheidenden Hinweis gab, war die Tatsache, dass es im Startcode der Anwendung einen anderen Codeabschnitt gab, der ausgeführt wurde und der ebenfalls eine Instanz dieses WCF-Proxys erstellt und NIE fehlschlug. Während ich versuchte herauszufinden, warum der eine immer funktioniert und der andere oft fehlschlägt, kam mir schließlich die Idee nachzusehen, wie der Code aufgerufen wird. Es stellte sich heraus, dass zwei verschiedene Hintergrundthreads erstellt werden, von denen jeder einen anderen Codeabschnitt ausführt. Jeder Thread ruft verschiedene Methoden auf, die Code enthalten, der eine Instanz des WCF-Proxy erstellt. Nun, das war der Knackpunkt, der dieses kleine Problem verursacht. Nachdem ich den Code so umgeschrieben hatte, dass alle Starttasks der Anwendung in einem einzigen Hintergrundthread ausgeführt werden, sind die Ausnahmen auf magische Weise verschwunden.

Es war reiner Zufall (und eine Menge Ausprobieren), dass ich das herausgefunden habe. Deshalb wollte ich meinen Fund an andere weitergeben, die sich möglicherweise mit demselben Problem herumschlagen.

Es handelt sich hierbei um einen übersetzten Blogbeitrag. Sie finden den Originalartikel unter Deciphering NullReferenceException or Binding Reference Cycle Errors in Windows Phone 7.1.