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을 참조하십시오.