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

Rod*_*ton 5 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.在调用期间传递null参数的正确方法是什么?谢谢!

Ada*_*rth 1

只是为了其他人的利益,您可以将空参数传递给委托(如果类型允许?此处需要澄清)。在您的情况下,IAsyncResult 将允许它。

至于调试,异常发生在Invoke上,因为你在给定的线程A上调试,异常发生在线程B上。你可以在多个线程上断点。在线程 B 代码上设置断点,您将看到异常接近源或位于源上。

请注意,如果多个线程同时运行代码,您的调试器将会跳转。在多线程中进行调试总是至少有点棘手,但是当您解决问题时会感到满意。

您还可以进一步改进您的答案代码,在检查 InvokeRequired 之前检查 null,因为这与您的逻辑无关(您的代码在使用之前、调用之后检查它)。这将节省将 Invoke 推送到消息泵上的时间(假设为 WinForms)。