非同期の Web Service 処理結果を DataRow の該当フィールドに反映する方法

  非同期で Web Service を利用して特定の処理結果を取得して編集中の DataRow のフィールドに設定する場合、「非同期の後処理メソッドにパラメータを渡す方法」 を利用して、編集中のカレントレコードの情報を、非同期後処理メソッドに渡す必要があります。
非同期処理の結果を反映する場合に留意する項目
1.処理依頼時のDataRowを特定するキーコードを記憶する。
      → 処理完了時にカレント DataRow が移動している可能性がある。極端な場合、削除されている可能性もある。
2.記憶したキーコードを含めたパラメータを非同期処理後の処理メソッドに受け渡す。
【使い方】

 Web Service で非同期メソッドを呼び出すサンプルです。
// myService は、Webサービス
// EndMethod は、処理結果取得の非同期コールバックメソッド
// myIAsyncResult は、IAsyncResultインターフェイス(非同期操作のステータスを表します)
// AfterReturnValueMethod は、非同期完了後に呼び出されるコールバックメソッド(AfterCallbackObjectHandler)


// 非同期終了(Callback)メソッドを設定する
EndMethod = new CallbackObjectHandler( myService.EndGetShareRate );
// 非同期開始時に受け渡すパラメータを設定する
object asyncState = new AsyncGetObject( parentForm, Args, EndMethod
                                    , new AfterCallbackObjectHandler( AfterReturnValueMethod ))


// 指定日の Object の値を取得する
try
{
    myIAsyncResult = myService.BeginGetShareRate( nType, targetDate, new System.AsyncCallback( GetObjects_CallBack )
                                                    , asyncState )
}
catch( Exception ex )
{
    MessageBox.Show("指定日の Object の値を取得開始に失敗しました。", "エラー",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
}

 Object値取得非同期のメソッドの完了時コールバックメソッドのサンプルです。
/// <summary>Object取得非同期コールバックメソッドハンドラ。</summary>
public delegate object  CallbackObjectHandler( System.IAsyncResult ar );
/// <summary>Object取得後処理メソッドハンドラ。</summary>
public delegate void    AfterCallbackObjectHandler( object value, bool status, object args );
/// <summary>
///  Object値取得非同期のメソッドの完了時コールバックメソッド。
/// </summary>
/// <param name="ar">非同期操作のステータス。</param>
public void GetObject_CallBack( System.IAsyncResult ar )
{
    //=======================
    // データの取得
    //=======================
    Debug.WriteLine("GetObject_CallBack Start");

    // 非同期メソッド実行パラメータを取得する
    AsyncGetObject    agv = (AsyncGetObject)ar.AsyncState;
    // 初期値を設定する
    object value = 0;
    bool    rtsFlag;

    try
    {
        // 値取得メソッドを起動する
        value = ((CallbackObjectHandler)agv.EndMethod)(ar);
        rtsFlag = true;
    }
    catch( Exception ex )
    {
        rtsFlag = false;
        Debug.WriteLine("ReadYearEndData Error:" + ex.Message);
    }

    // 後処理メソッドの設定を確認する
    if ( agv.AfterMethod == null )
        throw new ArgumentException("値取得後処理メソッド\"AfterMethod\"が設定されていません。");

    // 取得した値・結果ステータス及び引数をパラメータとして後処理メソッドを実行する
    this.Parent.Invoke( agv.AfterMethod, new object[]{value, rtsFlag, agv.Args} );

    // 非同期メソッド実行パラメータを開放
    agv = null;
}
【注意】
戻る