6

如果我在调用期间尝试将空参数传递给委托,则会收到空异常。代码如下所示:

        公共无效请求照片()
        {
            WCF.Service.BeginGetUserPhoto(Contact.UserID,
                新的 AsyncCallback(RequestPhotoCB), null);
        }

        公共无效RequestPhotoCB(IAsyncResult结果)
        {
            var photo = WCF.Service.EndGetUserPhoto(result);
            更新照片(照片);
        }

        公共代表无效 UpdatePhotoDelegate(二进制照片);
        公共无效UpdatePhoto(二进制照片)
        {
            if (InvokeRequired)
            {
                var d = new UpdatePhotoDelegate(UpdatePhoto);
                调用(d,新对象[] {照片});
            }
            别的
            {
                var ms = new MemoryStream(photo.ToArray());
                var bmp = 新位图(毫秒);
                pbPhoto.BackgroundImage = bmp;
            }
        }

问题出在这条线上:

调用(d,新对象[] {照片});

如果变量“照片”为空。在调用期间传递空参数的正确方法是什么?谢谢!

4

2 回答 2

1

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

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

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

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

于 2010-06-04T08:53:14.997 回答
0

好的,我想通了。问题不在于像我想的那样将 null 参数传递给委托。问题在于执行它的委托导致该行出现空异常:

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

我没有意识到问题的存在,因为它在 Invoke 线上崩溃了。

所以我改变了UpdatePhoto方法如下:

公共无效UpdatePhoto(二进制照片)
        {
            if (InvokeRequired)
            {
                var d = new UpdatePhotoDelegate(UpdatePhoto);
                调用(d,新对象[] {照片});
            }
            别的
            {
                如果(照片!= null)
                {
                    var ms = new MemoryStream(photo.ToArray());
                    var bmp = 新位图(毫秒);
                    pbPhoto.BackgroundImage = bmp;
                }
            }
        }

一切都很好!

于 2010-06-01T21:37:29.603 回答