2010-06-01 19 views
5

Tôi nhận được một ngoại lệ null nếu tôi cố gắng để vượt qua một tham số null cho một đại biểu trong một cuộc gọi. Đây là những gì mã trông giống như:Làm thế nào để gọi một đại biểu với một tham số 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; 
      } 
     } 

Vấn đề là với các dòng:

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

Nếu biến "ảnh" là null. Cách chính xác để vượt qua một tham số null trong một lời gọi là gì? Cảm ơn!

+2

có lẽ chỉ gọi phương thức UpdatePhoto của bạn khi ảnh của bạn không rỗng? Tôi không hiểu tại sao bạn cần phải gọi nó khi nó không có giá trị ... –

+0

@Tony, cảm ơn câu trả lời của bạn. Vâng, điều đó sẽ hiệu quả. Nhưng tôi vẫn muốn biết cách tốt nhất để làm điều này. Tôi chỉ mới bắt đầu sử dụng các cuộc gọi không đồng bộ trong suốt chương trình của tôi, do đó, điều này sẽ xuất hiện trở lại trong các tình huống khác, nơi tôi sẽ cần phải vượt qua một null. Hãy cho tôi biệt nếu bạn có ý tưởng gì đó. –

+0

fyi. Tôi đã thử những điều sau đây và nó không hoạt động: var d = UpdatePhotoDelegate mới (UpdatePhoto); var parm = đối tượng mới [1]; parm [0] = ảnh; Gọi (d, parm); –

Trả lời

1

Chỉ vì lợi ích của người khác, bạn có thể chuyển đối số rỗng cho đại biểu (nếu loại cho phép nó? Làm rõ cần ở đây). Trong trường hợp của bạn, IAsyncResult sẽ cho phép nó.

Đối với gỡ lỗi, ngoại lệ xảy ra trên Invoke vì bạn đang gỡ lỗi trên một Thread A đã cho, ngoại lệ xảy ra trên Thread B. Bạn có thể breakpoint nhiều luồng. Breakpoint mã Thread B và bạn sẽ thấy ngoại lệ gần hơn hoặc trên nguồn.

Lưu ý rằng trình gỡ lỗi của bạn sẽ nhảy xung quanh nếu nhiều chuỗi đang chạy mã cùng một lúc. Gỡ lỗi trong nhiều chủ đề luôn luôn là ít nhất một chút khó khăn, nhưng thỏa mãn khi bạn giải quyết các vấn đề. Bạn cũng có thể cải thiện thêm mã trả lời của bạn để kiểm tra null trước khi nó kiểm tra InvokeRequired, vì nó không phụ thuộc vào logic của bạn (mã của bạn kiểm tra nó trước khi sử dụng, sau khi gọi). Điều này sẽ tiết kiệm đẩy Invoke vào bơm tin nhắn (giả sử WinForms).

0

Binary là một loại nullable? Tôi không chắc chắn nếu nó là .... bạn có thể phải vượt qua trong một nhị phân nullable thay thế.

+0

Có, tôi tin rằng đó là một loại nullable (System.Data.Linq.Binary). var photo = WCF.Service.EndGetUserPhoto (kết quả); trả về một giá trị rỗng nếu không có ảnh (nhị phân), không có ngoại lệ. –

0

OK tôi đã tìm ra. Vấn đề là không với thông qua tham số null cho đại biểu như tôi nghĩ. Vấn đề là với các đại biểu thực hiện nó đã gây ra một ngoại lệ null trên dòng:

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

Tôi đã không nhận ra vấn đề là có bởi vì nó đã bị rơi trên đường Invoke.

Vì vậy, tôi đã thay đổi phương pháp UpdatePhoto như sau:

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

Và tất cả là tốt!

+1

Lần tới khi bạn gặp sự cố với Invoke, đừng quên kiểm tra InnerException của bạn - nó sẽ làm rõ vấn đề nhanh hơn một chút! –

Các vấn đề liên quan