C# - System.Threading - Task
- 1. 概要
- 2. Task
1. 概要
「System.Threading」で、スレッドを扱うクラスと言えば、「Thread」クラスで、それを使い慣れているのですが。
「Task」というものがあって、使う機会があり、苦労したのでメモを残します。
「Task」は、参考サイトによれば。
このクラスは Task 、値を返さない 1 つの操作を表し、通常は非同期的に実行されます。 Task オブジェクトは、.NET Framework 4 で最初に 導入されたタスク ベースの非同期パターン の中心的なコンポーネントの 1 つです。 オブジェクトによってTask実行される処理は通常、メイン アプリケーション スレッドではなくスレッド プール スレッドで非同期的に実行されるため、プロパティとIsFaultedプロパティをIsCanceledIsCompleted使用Statusして、タスクの状態を判断できます。 最も一般的には、ラムダ式を使用して、タスクが実行する作業を指定します。
値を返す操作の場合は、クラスを使用します Task<TResult> 。
だそうです(わたしは、読んでもよく頭にはいりませんが)。
本ページは、下記のサイトを参考にさせていただきました。
「Task クラス (System.Threading.Tasks) 」
「System.Threading.Tasks.Task クラス」
「方法: タスクとその子を取り消す - .NET」
「CancellationTokenSource クラス (System.Threading) 」
2. Task
「Task」は、例えば。
private void actualTask()
{
・・・ 処理 ・・・
}
のようなメソッドを用意しておいて。
Task task = Task.Run(() => { actualTask(); });
で、起動することができます。
下記のソースを書いて。
#pragma warning disable CS8602
using System;
using System.Threading;
public class Program
{
static public void Main ()
{
myClass myclass = new myClass();
myclass.run();
}
}
public class myClass
{
public myClass() {}
public void run()
{
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method start");
Task task = Task.Run(() => { actualTask(); });
task.Wait();
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method end");
}
private void actualTask()
{
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method start");
for(int i=0; i<5; i++)
{
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method " + i);
Thread.Sleep(1000);
}
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method end");
}
}
実行すると、下記の結果が得られます。
Main method start
actualTask method start
actualTask method 0
actualTask method 1
actualTask method 2
actualTask method 3
actualTask method 4
actualTask method end
Main method end
|
|