詳しくはここを読む: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必須)
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でのキャンセルトークンのリッスン