方法1 (同期)
Threadクラスで実行する。
static void Main(string[] args)
{
Thread worker = new Thread(Work);
worker.Start();
}
static void Work()
{
Console.WriteLine("Do work");
}
方法2 (同期)
Task.Run()で実行する。
Task.Run(() =>
{
Console.WriteLine("Do work");
});
方法3 (非同期)
async、awaitを利用してTask.Run()を非同期で実行する。
async void ServerProcess()
{
await Task.Run(() => ServerProcessAction());
}
asyncを書いたメソッド自体が非同期になるのと、その中のawaitの対象も非同期なので注意。awaitはTask型とTaskとvoidを返す。また、.NETのI/O系のメソッドはasyncの属性を持っていてawaitで呼び出せるものがあるので、上記の方法が使える。Task型は簡易なスレッドを表し、内部でシステムのスレッドプールに登録されて動作する。Task型のメソッドで待機させることも可能だし、TaskのリストからWaitAll()をすることもできる。Taskは戻り値の型を指定したTask。
方法4 (非同期)
Action型に代入してTask.Runで実行する。
static void Main(string[] args)
{
Action async;
async = Work;
Task t = Task.Run(async);
t.Wait();
}
static void Work()
{
Console.WriteLine("Do work");
}
方法5 (非同期)
デリゲート型を宣言して代入して実行する。
delegate void dlgt();
static void Main(string[] args)
{
dlgt d = Work;
d(); // 普通に呼び出す.
// 非同期に呼び出す.
IAsyncResult ar = d.BeginInvoke(new AsyncCallback(cl), null);
Console.WriteLine("WriteStringメソッドの終了を待機中...");
//非同期処理の終了を待ち、結果を取得
d.EndInvoke(ar);
}
static void Work()
{
Console.WriteLine("Do work");
}
static void cl(IAsyncResult result)
{
Console.WriteLine("End.");
}
方法6 (非同期)
Action型にメソッドを代入して実行する。
delegate void dlgt();
static void Main(string[] args)
{
Action async = Work;
async.BeginInvoke(cl, null);
}
static void Work()
{
Console.WriteLine("Do work");
}
static void cl(IAsyncResult result)
{
Console.WriteLine("End.");
}
.NETのメソッドとスレッド
すべてのメソッドはスレッド実行できる。
すべてのメソッドは非同期で実行でき、コールバックが指定でき、待機も可能であり、イベントとしても使える。