2010-06-01 4 views
5

Ich bekomme eine Null-Ausnahme, wenn ich versuche, während eines Aufrufs einen NULL-Parameter an einen Delegaten zu übergeben. Hier ist, was der Code wie folgt aussieht:Wie kann ein Delegat mit einem Null-Parameter aufgerufen werden?

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

Das Problem mit der Leitung:

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

Wenn die Variable "Foto" null ist. Was ist der richtige Weg, um während eines Aufrufs einen Null-Parameter zu übergeben? Danke!

+2

vielleicht rufen Sie nur Ihre UpdatePhoto-Methode nur, wenn Ihr Foto nicht null ist ?? Ich sehe nicht, warum du es nennen musst, wenn es null ist ... –

+0

@Tony, danke für deine Antwort. Ja, das würde funktionieren. Aber ich würde immer noch gerne den besten Weg wissen, dies zu tun. Ich fange jetzt gerade an, Async-Aufrufe in meinem Programm zu verwenden, daher wird dies in anderen Szenarien, in denen ich eine Null übergeben müsste, wieder auftauchen. Lass Mek jetzt, wenn du irgendwelche Ideen hast. –

+0

fyi. Ich habe folgendes versucht und es hat auch nicht funktioniert: var d = new UpdatePhotoDelegate (UpdatePhoto); var parm = neues Objekt [1]; parm [0] = Foto; Aufrufen (d, parm); –

Antwort

1

Nur zum Wohle anderer können Sie den Delegaten Nullargumente übergeben (wenn der Typ dies zulässt? Hier ist eine Klarstellung erforderlich). In Ihrem Fall wird IAsyncResult es erlauben.

Wie beim Debuggen tritt die Ausnahme bei Invoke auf, weil Sie für einen bestimmten Thread A debuggen, die Ausnahme tritt bei Thread B auf. Sie können mehrere Threads unterbrechen. Brechen Sie den Thread B-Code ab, und Sie werden die Ausnahme näher an oder auf der Quelle sehen.

Beachten Sie, dass Ihr Debugger herumspringen wird, wenn mehrere Threads Code gleichzeitig ausführen. Debugging in mehreren Threads ist immer ein wenig schwierig, aber zufriedenstellend, wenn Sie die Probleme lösen.

Sie könnten auch Ihren Antwortcode verbessern, um die Null zu überprüfen, bevor er InvokeRequired überprüft, da dies threadunabhängig zu Ihrer Logik ist (Ihr Code prüft sie vor der Verwendung nach dem Aufrufen). Dies wird das Schieben des Invoke auf die Nachrichtenpumpe (unter der Annahme von WinForms) ersparen.

0

Ist Binary ein NULL-fähiger Typ? Ich bin mir nicht sicher, ob es ... ist. Sie müssen stattdessen ein Nullable Binary übergeben.

+0

Ja, ich glaube, es ist ein Nullable Typ (System.Data.Linq.Binary). var photo = WCF.Service.EndGetUserPhoto (Ergebnis); gibt null zurück, wenn kein Foto (binär) vorhanden ist, ohne Ausnahme. –

0

OK Ich habe es herausgefunden. Das Problem war nicht mit der Übergabe des Null-Parameters an den Delegaten, wie ich dachte. Das Problem war, mit den Delegierten der Ausführung wurde auf der Linie eine Null-Ausnahme verursacht:

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

ich nicht das Problem war, da ahnte, weil es auf der Invoke-Linie wurde abstürzt.

So änderte ich die UpdatePhoto Methode wie folgt:

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

Und alles ist gut!

+1

Wenn du das nächste Mal ein Problem mit deinem Invoke hast, vergiss nicht, deine InnerException zu überprüfen - es sollte das Problem etwas schneller klären! –

Verwandte Themen