Silvelrihgtプロジェクトで生成したサービスクライアントメソッドのuserState引数について

サービス参照の追加で生成したサービスクライアントクラスに

public void GetMessageAsync(string name)

というメソッドがある場合、

public void GetMessageAsync(string name, object userState)

というオーバーロードメソッドも生成されます。
このオーバーロードメソッドのuserState引数について調べてみました。

アジェンダ

  • AsyncCompletedEventArgsクラスのUserStateプロパティ
  • 通信中ダイアログの表示・非表示の制御に応用

AsyncCompletedEventArgsクラスのUserStateプロパティ

userStateは、【MethodName】Completed イベントのEventArgsパラメーターの親クラスであるAsyncCompletedEventArgsクラスのUserStateプロパティに渡される値です。
例えば、GetMessageAsyncメソッドに対応するGetMessageAsyncCompletedイベントは、

public event System.EventHandler<GetMessageCompletedEventArgs> GetMessageCompleted;

と定義されます。GetMessageCompletedEventArgsクラスはAsyncCompletedEventArgsクラスを継承しています。
GetMessageAsyncメソッドのuserState引数に渡された値は、GetMessageCompletedEventArgsのUserStateプロパティにセットされます。
なお、userState引数の値は、サーバには渡されません。よって、巨大なインスタンスを渡しても通信量が増大することはありません。
MSDNの説明も合わせてご覧ください。

通信中ダイアログの表示・非表示の制御に応用

SilverlightアプリでWebサービスのコール時に通信中ダイアログを表示する - y_maeyamaの日記ラムダ式を使用した通信中ダイアログの表示例を示しましたが、userStateを使っても同じことが実現できます。

private void BtnHelloWorld_Click(object sender, RoutedEventArgs e)
{
    string name = TbxName.Text;

    // 通信中ダイアログを表示
    ChildWindow dialog = new ChildWindow();
    dialog.Title = "通信中";
    dialog.HasCloseButton = false;
    dialog.Content = "通信中です。" + Environment.NewLine + "しばらくお待ちください。";
    dialog.Show();

    HelloWorldServiceClient client = new HelloWorldServiceClient();
    client.GetMessageCompleted 
        += new EventHandler<GetMessageCompletedEventArgs>(Client_GetMessageCompleted);

    client.GetMessageAsync(name, dialog);
}

private void Client_GetMessageCompleted(object sender, GetMessageCompletedEventArgs e)
{
    // 通信中ダイアログを閉じる
    ChildWindow dialog = e.UserState as ChildWindow;
    dialog.Close();

    // 通信結果を処理する。
    TblResult.Text = e.Result;
}
}