非同期の後処理メソッドにパラメータを渡す方法

  非同期メソッドで処理完了後に呼ばれるメソッドにパラメータを渡すには、「AsyncState」を利用して行います。
【使い方】

 オブジェクト取得時の非同期コールバックパラメータクラスを用いてパラメータを渡すサンプルです。
// parentForm は、非同期メソッドの親となるForm
// Args は、受け渡すパラメータオブジェクト
// EndMethod は、非同期終了(Callback)メソッド
// AfterReturnValueMethod は、非同期完了後に呼び出されるコールバックメソッド(AfterCallbackObjectHandler)

// 非同期開始時に受け渡すパラメータを設定する
object asyncState = new AsyncGetObject( parentForm, Args, EndMethod
                                    , new AfterCallbackObjectHandler( AfterReturnValueMethod ))

 非同期完了時に呼び出されるメソッド内でパラメータを取得するサンプルです。
// ar は、非同期操作のステータス( System.IAsyncResult )

// IAsyncResult インターフェース AsyncState プロパティの値を取得して、該当クラスに cast する
AsyncGetObject  agv = (AsyncGetObject)ar.AsyncState;

 オブジェクト取得時の非同期コールバックパラメータクラスのサンプルです。
/// <summary>
/// オブジェクト取得時の非同期コールバックパラメータクラス
/// </summary>
public class AsyncGetObject
{
    private System.Delegate                    m_EndMethod      = null;            // 値取得メソッド
    private System.Delegate                    m_AfterMethod    = null;            // 後処理メソッド

    private System.Windows.Forms.Form          m_Parent         = null;            // ベースとなるForm
    private object                             m_Args           = null;            // 後処理メソッドに渡す引数

    /// <summary>
    /// オブジェクト取得時の非同期コールバックパラメータクラスの新しいインスタンスを初期化します。
    /// </summary>
    public AsyncGetObject()
    {
    }
    /// <summary>
    /// オブジェクト取得時の非同期コールバックパラメータクラスの新しいインスタンスを初期化します。
    /// </summary>
    public AsyncGetObject( System.Windows.Forms.Form parent, object args, CallbackObjectHandler endMethod
                                , AfterCallbackObjectHandler afterMethod )
    {
        m_Parent        = parent;
        m_Args          = args;
        m_EndMethod     = endMethod;
        m_AfterMethod   = afterMethod;
    }

    /// <summary>
    ///  スレッド処理のベースとなるFormを取得または設定します。
    /// </summary>
    public System.Windows.Forms.Form Parent
    {
        get { return m_Parent;}
        set { m_Parent = value;}
    }
    /// <summary>
    ///  値取得後のメソッドを取得または設定します。
    /// </summary>
    public System.Delegate EndMethod
    {
        get { return m_EndMethod;}
        set { m_EndMethod = value;}
    }
    /// <summary>
    ///  後処理メソッドを取得または設定します。
    /// </summary>
    public System.Delegate AfterMethod
    {
        get { return m_AfterMethod;}
        set { m_AfterMethod = value;}
    }
    /// <summary>
    ///  引数となるオブジェクトを取得または設定します。
    /// </summary>
    public object Args
    {
        get { return m_Args;}
        set { m_Args = value;}
    }
}
【注意】
戻る