TaskFactory.StartNewでタスクを実行する。
TaskFactory.StartNew メソッド (System.Threading.Tasks) | Microsoft Docs
たくさんオーバーライドメソッドがあるが、Actionだけのメソッドと同じ意味の引数を指定したメソッドで実行してみる。
ここを参考に、
// 名前空間の登録 using System; // 共通データ型と基本クラス(System名前空間) using System.Threading; // マルチスレッド(System.Threading名前空間) using System.Threading.Tasks; // タスク(System.Threading.Tasks名前空間) // MainClassの定義 class MainClass { // Mainメソッドの定義 static void Main() { // タスクの実行 TaskFactory tf = Task.Factory; // TaskFactoryのtfにいったん納める. tf.StartNew(() => // tf.StartNewでタスクをセットして実行. { // "Task(1)"~"Task(5)"まで出力. for (var i = 1; i <= 5; i++) // iが1から5まで繰り返す. { // "Task"とiを出力. Console.WriteLine("Task(" + i + ")"); // "Task(i)"を出力. // 1秒休止. Thread.Sleep(1000); // Thread.Sleepで1秒休止. } }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); // 処理内容をラムダ式で書く.(このオーバーライドとActionだけのメソッドは同じ意味.) // tfのプロパティの一部を出力. Console.WriteLine(tf.CreationOptions.ToString()); // CreationOptionsを出力. Console.WriteLine(tf.ContinuationOptions.ToString()); // ContinuationOptionsを出力. Console.WriteLine(tf.CancellationToken.ToString()); // CancellationTokenを出力. Console.WriteLine(tf.Scheduler.ToString()); // Schedulerを出力. // "Main(1)"~"Main(5)"まで出力. for (var i = 1; i <= 5; i++) // iが1から5まで繰り返す. { // "Main"とiを出力. Console.WriteLine("Main(" + i + ")"); // "Main(i)"を出力. // 1秒休止. Thread.Sleep(1000); // Thread.Sleepで1秒休止. } } }
Actionのラムダ式以外に、CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Defaultを指定しているが、結局は同じである。
ついでに、tf.CreationOptions、tf.ContinuationOptions、に加えて、tf.CancellationToken、tf.Schedulerも出力してみる。
あれ?Exception・・・。
どうもtf.Schedulerはnullの模様。
として、
None None System.Threading.CancellationToken null Main(1) Task(1) Main(2) Task(2) Main(3) Task(3) Main(4) Task(4) Main(5) Task(5) 続行するには何かキーを押してください . . .
TaskScheduler.Defaultを指定しているのに、tf.Schedulerはnullなのか・・・。
Sample/dotnet/TaskFactory/StartNew/src/TaskFactory_ at master · bg1bgst333/Sample · GitHub