LoginSignup
16
17

More than 5 years have passed since last update.

.NETのスレッド実行

Last updated at Posted at 2015-10-30

方法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のメソッドとスレッド

すべてのメソッドはスレッド実行できる。
すべてのメソッドは非同期で実行でき、コールバックが指定でき、待機も可能であり、イベントとしても使える。

16
17
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17