「Delegate」による非同期スレッド処理

非同期呼び出しは Delegate.BeginInvoke によって実行され、戻り値に IAsyncResultが返却されます。
このIAsyncResult を取得するにはEndInvokeを使用することにより、引数として IAsyncResult が取得できます。
デリゲートは、スレッド処理でも、引数の指定、戻り値の取得のし易いさが特徴的なので、ぜひ熟知しましょう。

// 処理の待ち合わせ
delegate void ThreadDelegate( );

class AsyncDelegateInvoke
{
public static void SampleMethod()
{
// 非同期に実行する内容
}

public static void Main()
{
ThreadDelegate dlgt=new ThreadDelegate( SampleMethod );
IAsyncResult asynresult = dlgt.BeginInvoke( null,null );
// メインスレッドで実行する内容
dlgt.EndInvoke( asynresult ); // EndInvoke による完了待ち
}
}

// IAsyncResult.IsComplete をポーリング
delegate void SampleAsyncDelegate( );

class AsyncDelegateInvoke
{
public static void ThreadDelegate()
{
// 非同期に実行する内容
}
public static void Main()
{
ThreadDelegate dlgt=new ThreadDelegate( SampleMethod );
IAsyncResult asynresult = dlgt.BeginInvoke( null,null );
// メインスレッドで実行する内容

// 完了待ち
while( !asynresult.IsComplete() ) Thread.Sleep(0);

 // 完了後の情報の引き取り
dlgt.EndInvoke( asynresult );
}
}

// 引数の指定とコールバックによる戻り値取得
delegate void ThreadDelegate( string str );

class AsyncDelegateInvoke
{
public static void SampleMethod(string str)
{
// 非同期に実行する内容
}

  //スレッド完了時に行われる処理
private static void AsyncComplete( IAsyncResult ar )
{
// スレッド完了時処理
AsyncResult asyncResult= (AsyncResult)ar;
 
ThreadDelegate dlgt = (ThreadDelegate)asyncResult.AsyncDelegate;

dlgt.EndInvoke( ar );
}


public static void Main()
{
     //インスタンス生成 
ThreadDelegate dlgt=new ThreadDelegate( SampleMethod );

//引数が複数ある場合は、カンマ区切りで複数指定する。 処理が完了するとAsyncCompleteで検知する。
AsyncCallback callback =new AsyncCallback(str , AsyncComplete );
 
     //処理実行 
IAsyncResult asynresult = dlgt.BeginInvoke( callback,null );
 
 // メインスレッドで実行する内容
}
}

コメント