Freigeben über


Decifrazione di NullReferenceException o degli errori relativi al ciclo di riferimenti binding in Windows Phone 7.1

Articolo originale pubblicato domenica 15 gennaio 2011

Di recente ho riscontrato un problema molto difficile da diagnosticare e correggere e che non sembrava verificarsi altrove, per cui ho pensato fosse utile scriverne qui nel caso lo stesso problema si presenti ad altri.  In un'applicazione Windows Phone 7.1 (Mango), è presente un riferimento a un servizio, nel mio caso un'applicazione WCF.  Con una certa frequenza, ma casualmente, veniva generata un'eccezione alla creazione del proxy WCF.  Per la precisione, questa riga di codice:

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

generava un'eccezione.  Questo fatto è già di per sé poco chiaro, ma ciò che è ancora meno comprensibile è il fatto che l'eccezione generata non era sempre la stessa.  Veniva generata una delle due eccezioni seguenti, senza che fosse possibile capire quale sarebbe stata generata in una determinata condizione:

  • NullReferenceException: in questo caso non venivano forniti dettagli, messaggi, eccezioni interne o altro.
  • Ciclo di riferimenti binding rilevato nella configurazione. Rimuovere il ciclo di riferimenti seguente: basicHttpBinding/BasicHttpBinding_IMyAppInterface

Uno degli aspetti più assurdi di questa situazione, è il fatto che l'eccezione venga generata solo quando il metodo viene chiamato da un codice eseguito all'avvio dell'applicazione; se il metodo viene chiamato in qualsiasi altro momento, non si verifica alcun problema.  Inoltre, se si scorre il codice di gestione delle eccezioni e si trascina la riga successiva dell'esecuzione in alto per creare l'istanza del proxy, l'esito è sempre positivo.  Si sono verificate altre stranezze con gradi diversi di successo, ma alla fine ho scoperto che nel codice di avvio dell'applicazione era presente un altro blocco di codice che veniva eseguito e creava un'istanza del proxy WCF sempre con esito positivo.  Nel tentativo di scoprire perché un codice funzionava sempre e uno aveva spesso esito negativo, ho pensato di guardare in che modo veniva chiamato il codice.  È emerso che erano presenti due thread in background diversi, ciascuno dei quali eseguiva un blocco di codice diverso.  Ciascun thread chiamava metodi diversi che contenevano codice tramite cui veniva creata un'istanza del proxy WCF.  Era proprio questa la causa del problema.  Con la riconfigurazione del codice in modo da eseguire tutte le attività di avvio dell'applicazione in un solo thread in background, le strane eccezioni sono scomparse.

Riuscire a individuare la causa è stata pura fortuna associata a molti tentativi, per questo ho pensato di condividere la mia esperienza nel caso vi trovaste nella stessa situazione.

Questo è un post di blog localizzato. Consultate l'articolo originale: Deciphering NullReferenceException or Binding Reference Cycle Errors in Windows Phone 7.1