.NET Framework デリゲート

Last-modified: 2006-12-21 (木) 18:24:29

デリゲートスレッド

  • BeginInvokeとEndInvokeは対になって必ず呼ばないとダメ。メモリリークする。
  • DelegateThreadのインスタンスは、クラスのメンバ変数に持たせるのが吉。
  • スレッドの処理でメインとなる部分は、必ず終了条件を持たせておけば、途中で終了させることも可能。EndInvokeは直接呼ばない。
  • 直接呼ばずにスレッドを終了させる場合、前述の終了条件フラグを立ててやる。
  • EndInvokeは、スレッドが終了した後に呼ばれる終了イベントの関数(BeginInvokeで登録したやつ)の引数を使って呼ぶべし。
  • デリゲートスレッドに通常のスレッドと同じように名前を付けたい場合(デバッガに表示させたい場合)、デリゲートスレッドで起こした関数内で「System::Threading::Thread::CurrentThread->Name」プロパティに名前を代入してやればいい(→ただし一度だけしか設定してはならない)。

デリゲートスレッドの終了時の処理

デリゲートスレッド終了時には、次の手段で行う。

System::Void MyClass::OnEnd_MyDelegateThread(System::IAsyncResult * ar)
{
	try {
		MyDelegate * ed = __try_cast<MyDelegate*>(ar->AsyncState);  /* (a) */
		if (ed != NULL) {
			ed->EndInvoke(ar);
		}
	} catch (System::Exception * exception) {
		System::Diagnostics::Debug::WriteLine(exception->ToString() );
	}
}

ただし、(a)のキャストは失敗する可能性がある。
失敗する場合は、BeginInvokeの第二引数に0を与える。