2010-06-01 40 views
5

如果我在调用过程中尝试传递一个空参数给委托,我得到一个空例外。下面的代码看起来像什么:如何使用null参数调用委托?

 
     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; 
      } 
     } 

问题与行:

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

如果变量“照片”为空。在调用过程中传递null参数的正确方法是什么? 谢谢!

+2

也许只有当您的照片不为空时才会调用UpdatePhoto方法?我不明白为什么你需要在它为空时调用它... – 2010-06-01 21:23:56

+0

@Tony,谢谢你的回复。是的,那会起作用。但我仍然想知道做到这一点的最佳方式。我现在只是开始在整个程序中使用异步调用,所以在其他需要传递null的场景中会再次出现这种情况。现在让我们来看看,如果你有任何想法。 – 2010-06-01 21:27:59

+0

fyi。我尝试了以下方法,但它也不起作用: var d = new UpdatePhotoDelegate(UpdatePhoto); var parm = new object [1]; parm [0] = photo; 调用(d,parm); – 2010-06-01 21:29:02

回答

1

只是为了他人的利益,你可以将null参数传递给委托(如果类型允许的话?这里需要澄清)。在你的情况下,IAsyncResult将允许它。

至于调试,Invoke发生异常,因为您正在调试给定的线程A,异常发生在线程B上。您可以断开多个线程。断点线程B代码,您将看到更接近或源于该源的异常。

注意,尽管如果多个线程同时运行代码,您的调试器将跳过。在多线程中调试总是有点棘手,但在解决问题时会很满意。

您还可以进一步改进您的答案代码,以便在检查InvokeRequired之前检查null,因为这与线程无关(您的代码在调用之后在使用之前检查它)。这将节省将Invoke推入消息泵(假设为WinForms)。

0

是二元可空类型吗?我不确定它是否是....您可能不得不传入可空的Binary。

+0

是的,我确信它是一个可以为空的类型(System.Data.Linq.Binary)。 var photo = WCF.Service.EndGetUserPhoto(result);如果没有照片(二进制),则返回null,无一例外。 – 2010-06-01 21:31:19

0

好的我想通了。问题不在于像我想的那样将null参数传递给委托。问题是与执行它上线造成空例外委托:

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

我没有意识到问题在那里,因为它是在调用行崩溃。

所以我改变了UpdatePhoto方法如下:

 
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; 
       } 
      } 
     } 

,一切都很好!

+1

下次您遇到您的Invoke问题时,请不要忘记检查您的InnerException - 它应该更快地澄清问题! – 2010-06-04 01:18:49