6

呼び出し中に null パラメータをデリゲートに渡そうとすると、null 例外が発生します。コードは次のようになります。

        public void RequestPhoto()
        {
            WCF.Service.BeginGetUserPhoto(Contact.UserID,
                new AsyncCallback(RequestPhotoCB), null);
        }

        public void RequestPhotoCB(IAsyncResult 結果)
        {
            var 写真 = WCF.Service.EndGetUserPhoto(結果);
            UpdatePhoto(写真);
        }

        パブリック デリゲート void UpdatePhotoDelegate(バイナリ写真);
        public void UpdatePhoto(バイナリ写真)
        {
            if (呼び出しが必要)
            {
                var d = 新しい UpdatePhotoDelegate(UpdatePhoto);
                Invoke(d, new object[] { 写真 });
            }
            そうしないと
            {
                var ms = new MemoryStream(photo.ToArray());
                var bmp = 新しいビットマップ (ミリ秒);
                pbPhoto.BackgroundImage = bmp;
            }
        }

問題は次の行にあります。

Invoke(d, new object[] { 写真 });

変数「写真」が null の場合。呼び出し中に null パラメータを渡す正しい方法は何ですか? ありがとう!

4

2 に答える 2

1

他の人の利益のために、null 引数をデリゲートに渡すことができます (型で許可されている場合は、ここで説明が必要です)。あなたの場合、 IAsyncResult はそれを許可します。

デバッグに関しては、特定のスレッド A でデバッグしているため、Invoke で例外が発生し、スレッド B で例外が発生します。複数のスレッドにブレークポイントを設定できます。スレッド B コードをブレークポイントすると、ソースの近くまたはソース上に例外が表示されます。

ただし、複数のスレッドが同時にコードを実行している場合、デバッガーがジャンプすることに注意してください。複数のスレッドでのデバッグは常に少しトリッキーですが、問題を解決すると満足のいくものになります。

また、応答コードをさらに改善して、InvokeRequired をチェックする前に null をチェックすることもできます。これは、ロジックに対してスレッドに依存しないためです (コードは、使用する直前、呼び出し後にチェックします)。これにより、Invoke をメッセージ ポンプにプッシュする手間が省けます (WinForms を想定)。

于 2010-06-04T08:53:14.997 に答える
0

わかりました。問題は、私が思っていたように null パラメータをデリゲートに渡すことではありませんでした。問題は、実行中のデリゲートにあり、次の行で null 例外が発生していました。

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

Invoke 行でクラッシュしていたため、問題がそこにあることに気づきませんでした。

そこで、UpdatePhoto メソッドを次のように変更しました。

public void UpdatePhoto(バイナリ写真)
        {
            if (呼び出しが必要)
            {
                var d = 新しい UpdatePhotoDelegate(UpdatePhoto);
                Invoke(d, new object[] { 写真});
            }
            そうしないと
            {
                もし (写真 != null)
                {
                    var ms = new MemoryStream(photo.ToArray());
                    var bmp = 新しいビットマップ (ミリ秒);
                    pbPhoto.BackgroundImage = bmp;
                }
            }
        }

そして、すべてが順調です!

于 2010-06-01T21:37:29.603 に答える