2010-06-01 15 views
5

Obtengo una excepción nula si trato de pasar un parámetro nulo a un delegado durante una invocación. Esto es lo que el código es el siguiente:¿Cómo invocar a un delegado con un parámetro nulo?

 
     public void RequestPhoto() 
     { 
      WCF.Service.BeginGetUserPhoto(Contact.UserID, 
       new AsyncCallback(RequestPhotoCB), null); 
     } 

     public void RequestPhotoCB(IAsyncResult result) 
     { 
      var photo = WCF.Service.EndGetUserPhoto(result); 
      UpdatePhoto(photo); 
     } 

     public delegate void UpdatePhotoDelegate(Binary photo); 
     public void UpdatePhoto(Binary photo) 
     { 
      if (InvokeRequired) 
      { 
       var d = new UpdatePhotoDelegate(UpdatePhoto); 
       Invoke(d, new object[] { photo }); 
      } 
      else 
      { 
       var ms = new MemoryStream(photo.ToArray()); 
       var bmp = new Bitmap(ms); 
       pbPhoto.BackgroundImage = bmp; 
      } 
     } 

El problema es con la línea:

 
Invoke(d, new object[] { photo }); 

Si la variable "foto" es nulo. ¿Cuál es la forma correcta de pasar un parámetro nulo durante una invocación? Gracias!

+2

quizá sólo llame a su método de UpdatePhoto sólo cuando su foto no es nulo ?? No veo por qué tendrías que llamar cuando sea nulo ... –

+0

@Tony, gracias por tu respuesta. Sí, eso funcionaría. Pero aún me gustaría saber la mejor manera de hacer esto. Ahora estoy empezando a utilizar llamadas asíncronas en todo mi programa, por lo que esto volverá a surgir en otros escenarios en los que necesitaría pasar un nulo. Déjame saber si tienes alguna idea. –

+0

fyi. Intenté lo siguiente y tampoco funcionó: var d = new UpdatePhotoDelegate (UpdatePhoto); var parm = new object [1]; parm [0] = foto; Invocar (d, parm); –

Respuesta

1

sólo para el beneficio de los demás, puede pasar argumentos nulos a los delegados (si el tipo lo permite? Aclaración necesario aquí). En tu caso, IAsyncResult lo permitirá.

En cuanto a la depuración, la excepción se da en la invocación, ya que se está depurando en un subproceso A dada, la excepción se produce en el hilo B. Puede punto de ruptura varios subprocesos. Cambie el código del subproceso B y verá la excepción más cerca o en la fuente.

Aviso sin embargo, que el depurador saltará en torno a si se están ejecutando múltiples hilos de código al mismo tiempo. La depuración en múltiples hilos siempre es al menos un poco complicada, pero satisfactoria cuando resuelve los problemas.

También podría mejorar su código de respuesta para verificar el nulo antes de que revise el InvokeRequired, ya que esto es independiente de la secuencia de su lógica (su código lo comprueba justo antes de su uso, después de la invocación). Esto ahorrará empujando la Invocación en la bomba de mensajes (asumiendo WinForms).

0

es binario un tipo anulable? No estoy seguro de si es ... puede que tenga que pasar un binario que admite nulos.

+0

Sí, creo que es un tipo que admite nulos (System.Data.Linq.Binary). var photo = WCF.Service.EndGetUserPhoto (resultado); devuelve un valor nulo si no hay foto (binario), sin excepción. –

0

Aceptar lo he descubierto. El problema NO era pasarle el parámetro nulo al delegado como yo pensaba. El problema era con el delegado ejecución que estaba causando una excepción nula en la línea:

 
var ms = new MemoryStream(photo.ToArray()); 

no me di cuenta que el problema era allí porque estaba fallando en la línea de invocación.

Así que cambió el método UpdatePhoto de la siguiente manera:

 
public void UpdatePhoto(Binary photo) 
     { 
      if (InvokeRequired) 
      { 
       var d = new UpdatePhotoDelegate(UpdatePhoto); 
       Invoke(d, new object[] { photo}); 
      } 
      else 
      { 
       if (photo != null) 
       { 
        var ms = new MemoryStream(photo.ToArray()); 
        var bmp = new Bitmap(ms); 
        pbPhoto.BackgroundImage = bmp; 
       } 
      } 
     } 

Y todo está bien!

+1

La próxima vez que se encuentre con un problema con su Invoke, no olvide verificar su InnerException. ¡Debería aclarar el problema un poco más rápido! –

Cuestiones relacionadas