-2

Webサービスでこのイベントがあります:

public event FindProductsByCharacteristicsCompletedEventHandler FindProductsByCharacteristicsCompleted
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        add
        {
            _findProductsByCharacteristicsCompleted += value;
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        remove
        {
            _findProductsByCharacteristicsCompleted -= value;
        }
    }

次に、クラスの後半でイベント値がnullかどうかを確認します。

private void OnFindProductsByCharacteristicsOperationCompleted(object arg)
    {
        var handler = _findProductsByCharacteristicsCompleted;
        if (handler == null)
            return;
        handler(this, new FindProductsByCharacteristicsCompletedEventArgs(completedEventArgs.Results, completedEventArgs.Error, completedEventArgs.Cancelled, completedEventArgs.UserState));
    }
4

1 に答える 1

2

イベントの実装は、無限の再帰のように見えます。実装でプロパティ自体を使用しています。
これに変更します:

private FindProductsByCharacteristicsCompletedEventHandler
            _findProductsByCharacteristicsCompleted;

public event FindProductsByCharacteristicsCompletedEventHandler
                 FindProductsByCharacteristicsCompleted 
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    add
    {
        _findProductsByCharacteristicsCompleted += value;
    }
    [MethodImpl(MethodImplOptions.Synchronized)]
    remove
    {
        _findProductsByCharacteristicsCompleted -= value;
    }
}

そして今、次のようにメソッドを実装します。

var handler = _findProductsByCharacteristicsCompleted;
if(handler == null)
    return;

handler(this, new FindProductsByCharacteristicsCompletedEventArgs(...));

これには、スレッドセーフであるという利点があります。

nullをチェックした後、実際にイベントを発生させる前に、誰かが最後のハンドラーをイベントから切り離したとしても、変更されていないローカル変数を操作しているため、例外は発生しません。

于 2013-02-08T13:30:24.127 に答える