LoginSignup
0
0

More than 1 year has passed since last update.

C#の並列プログラミング

Posted at

詳しくはここを読む:https://docs.microsoft.com/ja-jp/dotnet/standard/threading/

プロセスとスレッド

プロセスは、OSから見た実行中のログラムのこと。一つのプロセスには、一つのメモリ空間が与えられる。つまり、プロセスの数だけメモリが割り当てられる。
スレッドは、OSがプロセッサの利用時間を割り当てる基本単位。プロセスの中にスレッドがあるイメージ。メモリを共有しているから、データの排他管理に気を付ける必要がある。
今回、「排他制御を非同期実行するために別スレッドで行う」ことと、「別プロセスを立ち上げてコマンド実行すること」の2つを行った。
前者は同じプロセスの中で実行できるが、後者はプログラムそのものが変わるので別プロセスとなる。

別プロセスを動かす

Processオブジェクトを作成して起動時の情報を設定し、Startし、WaitForExitで待機、終了したら破棄する。
プロセスはDisposableメソッドであり、終了(Close)・破棄する(Dispose)必要がある。
忘れがちなので、できるならUsingを使うのがいい。

非同期にタスクを実行する

タスクを非同期実行する場合、別スレッドで展開されることになる。
スレッドを終了させる際は、元スレッドに合流すればいい。
複数スレッドの状況をを管理するため、CancellationTokenオブジェクトなどを用いる。
https://docs.microsoft.com/ja-jp/dotnet/standard/threading/cancellation-in-managed-threads
(CancellationTokenもIDisposableメソッドなので、Dispose必須)

sample

public static void Main(){
 CancellationTokenSource source = null;
 try{
  source = new CancellationToken();
  Task.Run(() => {Do(source.token);}, source.Token);
  Task.Delay(1000);
  source.Cancel();
 }
 finally
 {
  source?.Cancel();
  source?.Dispose();
 }
}

private void Do(CancellationToken cancellationToken){
 while(cancellationToken.WaitHandle.WaitOne(waitMilliSec))
  {
   Console.WriteLine("a");
   if(cancellationToken.IsCancellRequested())
   {
    return;
   }
  }
}

もっと詳しく

WaitHandleでのキャンセルトークンのリッスン

0
0
0

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
0
0