最終更新:2012-04-23 (月) 20:22:36 (4385d)
BeginInvoke
Top / BeginInvoke
http://msdn.microsoft.com/ja-jp/library/2e08f6yc(VS.80).aspx
コントロールの基になるハンドルが作成されたスレッド上で、指定したデリゲートを非同期的に実行します。
メンバ
メモ
- BeginInvokeメソッドは、共通言語ランタイム(CLR)が管理しているスレッドプールにメソッド実行を依頼し、すぐに制御を戻してくる。メソッドの実行が完了していなくても、制御が戻ってくるため、コードは先に進むことができる。
非同期デリゲート
BeginInvokeとEndInvokeは必ず対で呼び出さなければならない。 EndInvokeメソッドを呼び出し忘れると、メモリリークを引き起こす可能性がある。
引数
- 本来のメソッドの引数
- AsyncResultデリゲート
- メソッドの実行が終了したときに呼び出されるメソッド(コールバック?・メソッド)を渡すことができる。
- 1つは状態オブジェクト
関連
using System; delegate void ShowMessageDelegate(string msg); class Callable { internal void ConcreteShowMessage(string msg) { System.Threading.Thread.Sleep(5 * 1000); Console.WriteLine(msg); } } class Caller { internal ShowMessageDelegate ShowMessage; internal IAsyncResult CallDelegate() { //デリゲートの引数,コールバック,state IAsyncResult ret = ShowMessage.BeginInvoke("hello, from delegate!", new AsyncCallback(Callback), ShowMessage); return ret; } internal void Callback(IAsyncResult ar) { ShowMessageDelegate usedDelegate = (ShowMessageDelegate)ar.AsyncState; usedDelegate.EndInvoke(ar); } } class App { static void Main() { Callable callable = new Callable(); Caller caller = new Caller(); caller.ShowMessage = new ShowMessageDelegate(callable.ConcreteShowMessage); IAsyncResult ar = caller.CallDelegate(); while(!ar.IsCompleted) { System.Threading.Thread.Sleep(500); Console.Write("."); } Console.WriteLine("Done."); } }
System.Windows.Forms.Control
Control.BeginInvoke (Delegate) Control.BeginInvoke (Delegate, Object[]) //Control1.Invoke(delegate, new object[] {str});//引数の渡し方
public IAsyncResult BeginInvoke ( Delegate method ) public IAsyncResult BeginInvoke ( Delegate method, params Object[] args//特定のメソッドに引数として渡すオブジェクトの配列。引数が必要ない場合は、null 参照 (Visual Basic では Nothing) を指定できます。 )