ある関数を簡単にスレッド化する方法、記述法を考えてみた。
DoWork関数をスレッド化し、終了イベントを受け取るサンプル。
Type1は呼び出し側と同じスレッド。Type2はよくあるパターン。Type3はさらに簡略化した方法。


private void button1_Click(object sender, EventArgs e)
{
Myclass m = new Myclass();

// Type 1
int a1 = m.DoWork(1,2);

// Type 2
m.DoWorkComplete += new Myclass.MyDoWorkHandler(DoWorkComplete);
m.DoWorkAsync( 1, 2 );


// Type 3
m.DoWorkAsyncX( 1,2, ((result)=>
{
int a3 = result;

}));
}

void DoWorkComplete(int result)
{
int a2 = result;
}


public class Myclass
{
// Type 1
public int DoWork( int a, int b )
{
return a + b;
}

// Type 2
public delegate void MyDoWorkHandler(int a);
public event MyDoWorkHandler DoWorkComplete;

public void DoWorkAsync( int a, int b )
{
Func<int> func = new Func<int>(()=>
{
return DoWork(a,b);
});

func.BeginInvoke((ar)=>
{
DoWorkComplete(func.EndInvoke(ar));

},null );

}


// Type 3
public void DoWorkAsyncX( int a, int b, Action<int> CompleteFunc )
{
Func<int> func = new Func<int>(()=>
{
return DoWork(a,b);
});

func.BeginInvoke((ar)=>
{
CompleteFunc(func.EndInvoke(ar));
},null );

}
}