如果我在调用期间尝试将null参数传递给委托,则会出现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 });
如果变量“photo”为空。在调用期间传递null参数的正确方法是什么? 谢谢!
答案 0 :(得分:1)
为了别人的利益,你可以将null参数传递给委托(如果类型允许的话?这里需要澄清)。在您的情况下,IAsyncResult将允许它。
对于调试,在Invoke上发生异常,因为您在给定的线程A上进行调试,在线程B上发生异常。您可以断点多个线程。断点线程B代码,您将看到更接近或源上的异常。
请注意,如果多个线程同时运行代码,您的调试器将跳转。在多个线程中进行调试总是至少有点棘手,但在解决问题时会感到满意。
您还可以在检查InvokeRequired之前进一步改进您的答案代码以检查null,因为这与您的逻辑是线程无关的(您的代码在使用之前,在调用之后检查它)。这将节省将Invoke推送到消息泵(假设WinForms)。
答案 1 :(得分:0)
好的,我明白了。问题不在于像我想的那样将null参数传递给委托。问题在于委托执行它导致行上出现空异常:
var ms = new MemoryStream(photo.ToArray());
我没有意识到问题是因为它在Invoke线上崩溃了。
所以我按如下方式更改了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; } } }
一切都很好!