Artículo original publicado el domingo, 15 de enero de 2012

Recientemente he descubierto un problema extremadamente difícil de diagnosticar y corregir, y no he logrado ver este problema en ningún otro lugar por lo que pensé que escribiría acerca de él aquí por si le surge de nuevo a alguien.  En una aplicación con Windows Phone 7.1 (es decir, Mango), tiene una referencia de servicio, en mi caso, una aplicación WCF.  Lo que veía es que, con frecuencia pero de manera aleatoria, generaría una excepción creando solo el proxy WCF.  Lo que quiero decir con eso es que la siguiente línea de código:

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

Generaría una excepción.  Aunque eso es algo que inherentemente resultaba una locura, lo que era más enigmático y frustrante es que la excepción que generaría no siempre era la misma.  Generaría una de estas dos excepciones - sin ton ni son en lo referente a lo que generaría cuando:

  • NullReferenceException: absolutamente ningún detalle aquí, ningún mensaje, ninguna excepción interna, nada.
  • Se detectó un ciclo de referencia de enlace en su configuración. Se debe quitar el siguiente ciclo de referencia: basicHttpBinding/BasicHttpBinding_IMyAppInterface

Una de las (muchas) locuras de esto es que la excepción solo se generaría cuando este método se invocara desde algún código que se ejecutara durante el inicio de la aplicación; invoque dicho método en cualquier otro momento y no tendrá problemas.  Además, si solo pasaba por el código de control de excepciones y, a continuación, arrastraba la siguiente línea de ejecución de nuevo hacia arriba para crear la instancia de proxy, siempre funcionaba.  Hubo otras cuestiones realmente extrañas que tuvieron distintos grados de éxito pero lo que finalmente me puso sobre aviso fue el hecho de que en el código de inicio de la aplicación hubo otro fragmento de código que se ejecutó y también creó una instancia de dicho proxy WCF y NUNCA tuvo errores.  Por tanto, al intentar averiguar por qué uno siempre funcionaba y otro a menudo tenía errores, finalmente se me ocurrió mirar la manera en que se invocaba el código.  Como resultó ser, tuve dos diferentes subprocesos de segundo plano creándose, y cada uno de ellos ejecutaba un fragmento de código diferente.  Cada subproceso estaba llamando a diferentes métodos que contenían código que crearían una instancia del proxy de WCF. Bien, esto resultó ser la perdición y causa de este pequeño problema.  Al volver a configurar el código para que todas las tareas de inicio de aplicación se ejecuten en un subproceso en segundo plano único, las excepciones extrañas desaparecieron mágicamente.

Por supuesto, fue cuestión de pura casualidad averiguar eso (junto con mucha ensayo y error) por lo que pensé que compartiría este pequeño fragmento de código para el caso que se encuentre en un aprieto similar.

Esta entrada de blog es una traducción. Puede consultar el artículo original en Deciphering NullReferenceException or Binding Reference Cycle Errors in Windows Phone 7.1