最終更新:2012-04-23 (月) 20:22:36 (2733d)  

BeginInvoke はてなブックマークを見る
Top / BeginInvoke

http://msdn.microsoft.com/ja-jp/library/2e08f6yc(VS.80).aspx

コントロールの基になるハンドルが作成されたスレッド上で、指定したデリゲートを非同期的に実行します。

メンバ

メモ

  • BeginInvokeメソッドは、共通言語ランタイム(CLR)が管理しているスレッドプールにメソッド実行を依頼し、すぐに制御を戻してくる。メソッドの実行が完了していなくても、制御が戻ってくるため、コードは先に進むことができる。
  • Invoke:コントロールの基になるウィンドウ ハンドルを所有するスレッド上で、指定したデリゲートを実行します。(同期呼び出し?)

非同期デリゲート

BeginInvokeEndInvokeは必ず対で呼び出さなければならない。 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) を指定できます。
)
 

関連