2010-06-01 39 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