お手軽非同期

/// <summary>
/// お手軽非同期
/// </summary>
public class EasyAsync {
  /// <summary>
  /// 終了イベント
  /// </summary>
  static public event EventHandler Finished;
  /// <summary>
  /// 開始イベント
  /// </summary>
  static public event EventHandler Starting;

  /// <summary>
  /// 指定されたメソッドを非同期で実行します。
  /// </summary>
  /// <param name="invoker">実行対象メソッド。</param>
  /// <param name="key">メソッドを特定するためのキー。</param>
  static public void AsyncExecute( MethodInvoker invoker, int key ) {
    EasyAsync a = new EasyAsync( invoker, key );
    a.Execute();
  }

  private readonly MethodInvoker _invoker;
  private readonly int _key;
  /// <summary>
  /// キー。
  /// </summary>
  public int Key {
    get { return _key; }
  }

  EasyAsync( MethodInvoker invoker, int key ) {
    _invoker = invoker;
    _key = key;
  }

  void Execute() {
    OnStarting();
    _invoker.BeginInvoke( Callback, null );
  }

  void Callback( IAsyncResult result ) {
    _invoker.EndInvoke( result );
    OnFinished();
  }

  protected virtual void OnStarting() {
    if (Starting != null) {
      Starting( this, EventArgs.Empty );
    }
  }

  protected virtual void OnFinished() {
    if (Finished != null) {
      Finished( this, EventArgs.Empty );
    }
  }
}

usage

EasyAsync.Starting += Async_Starting;
EasyAsync.Finished += Async_Finished;

EasyAsync.AsyncExecute( delegate { /*ここに非同期処理を書く*/ }, 0 );