非同期呼び出しは 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 );
// メインスレッドで実行する内容
}
}
コメント