如何使用null参数调用委托?

时间:2010-06-01 21:16:10

标签: c# delegates invoke nullreferenceexception

如果我在调用期间尝试将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参数的正确方法是什么? 谢谢!

2 个答案:

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

一切都很好!