Причина исключения NullReferenceException или ошибок базовых циклов привязки в Windows Phone 7.1

Исходная статья опубликована в воскресенье, 15 января 2012 г.

Недавно я столкнулся с одной очень сложной для диагностики и устранения проблемой. Найти ее обсуждение мне нигде не удалось, поэтому я решил написать о ней здесь на случай, если с ней столкнется кто-либо еще. Допустим, в 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