39

Web サービスとの通信後にイベントを発生させるユーザー コントロールがあります。親は、発生時にこのイベントを処理します。私が適切なアプローチだと思ったのは、Webサービスから返されたオブジェクトをeventargsとして親に渡すことですか???

これが適切な方法である場合、その方法に関する指示が見つからないようです。

ユーザーコントロール

public event EventHandler LoginCompleted;

その後、サービスが biz オブジェクトを返した後:

if (this.LoginCompleted != null)
        {
            this.LoginCompleted(this, new EventArgs() //this is where I would attach / pass my biz object no?);  
        }

ctrl_Login.LoginCompleted += ctrl_Login_LoginCompleted;
....snip....
void ctrl_Login_LoginCompleted(object sender, EventArgs e)
    {
        //get my object returned by login
    }

だから私の質問は、ユーザーオブジェクトを親に戻すための「承認された」方法は何でしょうか? すべてがアクセスできるプロパティ クラスを作成し、そこに配置しますか?

4

5 に答える 5

48

EventHandler<T>どこTから派生したクラスであるかを使用して、イベントを宣言する必要がありEventArgsます。

public event EventHandler<LoginCompletedEventArgs> LoginCompleted;

LoginCompletedEventArgs次のようになります。

public class LoginCompletedEventArgs : EventArgs
{
    private readonly YourBusinessObject _businessObject;

    public LoginCompletedEventArgs(YourBusinessObject businessObject)
    {
        _businessObject = businessObject;
    }

    public YourBusinessObject BusinessObject
    {
        get { return _businessObject; }
    }
}

使用法は次のようになります。

private void RaiseLoginCompleted(YourBusinessObject  businessObject)
{
    var handler = LoginCompleted;
    if(handler == null)
        return;

    handler(this, new LoginCompletedEventArgs(businessObject));
}

私がどのように実装したかに注目してくださいRaiseLoginCompleted。これは、イベントを発生させるスレッドセーフ バージョンです。NullReferenceExceptionあるスレッドがイベントを発生させ、別のスレッドがifチェック後、実際にハンドラーを呼び出す前に最後のハンドラーのサブスクライブを解除する競合状態シナリオで発生する可能性を排除します。

于 2013-02-20T10:48:49.483 に答える