Как вызвать делегата с нулевым параметром? - PullRequest
5 голосов
/ 02 июня 2010

Я получаю нулевое исключение, если пытаюсь передать нулевой параметр делегату во время вызова. Вот как выглядит код:

        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" равна нулю. Как правильно передать нулевой параметр во время вызова? Спасибо!

Ответы [ 2 ]

1 голос
/ 04 июня 2010

Просто в интересах других, вы можете передавать нулевые аргументы делегатам (если тип позволяет это? Разъяснение необходимо здесь). В вашем случае IAsyncResult позволит это сделать.

Что касается отладки, исключение возникает в Invoke, поскольку вы выполняете отладку в заданном потоке A, исключение происходит в потоке B. Вы можете установить точку останова для нескольких потоков. Точка останова - код Thread B, и вы увидите исключение ближе к источнику или рядом с ним.

Обратите внимание, что ваш отладчик будет перепрыгивать, если несколько потоков одновременно запускают код. Отладка в нескольких потоках всегда, по крайней мере, немного сложнее, но удовлетворяет, когда вы решаете проблемы.

Вы могли бы также улучшить свой код ответа, чтобы проверить нулевое значение, прежде чем проверять InvokeRequired, поскольку это не зависит от потока для вашей логики (ваш код проверяет это непосредственно перед использованием, после Invoking). Это сохранит нажатие Invoke на насос сообщений (при условии WinForms).

0 голосов
/ 02 июня 2010

ОК, я понял это. Проблема была НЕ в передаче нулевого параметра делегату, как я думал. Проблема была в том, что выполняемый им делегат вызывал пустое исключение в строке:

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

И все хорошо!

...