.net column

.NET開発者のためのブログメディア
ユーザー登録

C#におけるTaskの使い方とは?実行結果の取得方法・待ち合わせ方法

2020年10月29日
SE
C#ではTaskで何ができるのですか。
PM
時間のかかる処理を非同期にして並列で処理することができます。

C#におけるTaskの使い方とは?


今回は、C#におけるTaskの使い方について説明します。

 

Taskを利用すると、非同期処理を実現できます。時間のかかる処理を非同期にして並列で処理できる仕組みです。

 

Taskの基本的な使い方から、実行結果の取得方法、待ち合わせ方法を紹介します。

 

C#におけるTaskの使い方に興味のある方はぜひご覧ください。

基本的な使い方

C#におけるTaskの基本的な使い方を紹介します。

 

実際のソースコードを見てみましょう。

 

ここでは、時間のかかる処理をThread.Sleepメソッドと仮定します。

namespace ConsoleApplication1
{
class Program
{
static void Main()
{
// Taskの実行
Task task1 = Task.Run(() => {
Console.WriteLine(“”task1開始””);
Thread.Sleep(5000);
Console.WriteLine(“”task1終了””);
});

// Taskの実行
Task task2 = Task.Run(() => {
Console.WriteLine(“”task2開始””);
Thread.Sleep(3000);
Console.WriteLine(“”task2終了””);
});

Console.ReadLine();
}
}
}

実行結果は以下のようになります。

task1とtask2が並列で動作していることが分かります。

結果を取得する

C#のTaskで、実行結果を取得する方法を紹介します。

 

実際のソースコードを見てみましょう。

namespace ConsoleApplication1
{
class Program
{
static void Main()
{
// Taskの実行
Task<string> task1 = Task.Run(() => {
return SomeMethod(5000);
});

// 結果の取得
// SomeMethodが終わるまで待機する
string result = task1.Result;
Console.WriteLine(result);

Console.ReadLine();
}

static string SomeMethod(int millisec)
{
Console.WriteLine(“”SomeMethod “” + millisec + “” 開始””);
Thread.Sleep(millisec);

return “”SomeMethod “” + millisec + “” 終了””;
}
}
}

実行結果は以下のようになります。

SomeMethodの戻り値がstringなので、””Task””と宣言します。

 

実行結果を””task1.Result””で取得します。

 

Resultは、SomeMethodが終わるまで待機していることが分かります。

 

このように、C#のTaskでは、実行結果を取得できます。

非同期処理の終了待ち合わせ(wait)

C#のTaskでは、waitメソッドで非同期処理の終了待ち合わせができます。

 

実際のソースコードを見てみましょう。

namespace ConsoleApplication1
{
class Program
{
static void Main()
{
// Taskの実行
Task task1 = Task.Run(() => {
SomeMethod(5000);
});

// task1が終わるまで待機
task1.Wait();
Console.WriteLine(“”Main終了””);

Console.ReadLine();
}

static void SomeMethod(int millisec)
{
Console.WriteLine(“”SomeMethod “” + millisec + “” 開始””);
Thread.Sleep(millisec);
Console.WriteLine(“”SomeMethod “” + millisec + “” 終了””);
}
}
}

実行結果は以下のようになります。

Waitメソッドでtask1が終了するまで待機していることが分かります。

 

このように、C#のTaskで非同期処理の終了待ち合わせができます。

非同期処理の終了待ち合わせ(WhenAll)

C#のTaskでは、WhenAllメソッドで複数の非同期処理の終了待ち合わせができます。

 

実際のソースコードを見てみましょう。

namespace ConsoleApplication1
{
class Program
{
static async Task Main()
{
// Taskの実行
Task task1 = Task.Run(() => {
SomeMethod(5000);
});

// Taskの実行
Task task2 = Task.Run(() => {
SomeMethod(3000);
});

// task1, task2が終わるまで待機
await Task.WhenAll(task1, task2);
Console.WriteLine(“”Main終了””);

Console.ReadLine();
}

static void SomeMethod(int millisec)
{
Console.WriteLine(“”SomeMethod “” + millisec + “” 開始””);
Thread.Sleep(millisec);
Console.WriteLine(“”SomeMethod “” + millisec + “” 終了””);
}
}
}

実行結果は以下のようになります。

WhenAllメソッドでtask1, task2の両方が終わるまで待機していることが分かります。

 

このように、C#のTaskではWhenAllメソッドで複数の非同期処理の終了待ち合わせができます。

非同期処理の終了待ち合わせ(WhenAny)

C#のTaskでは、WhenAnyメソッドで複数の非同期処理のうちのいずれか一つの終了待ち合わせができます。

 

実際のソースコードを見てみましょう。

namespace ConsoleApplication1
{
class Program
{
static async Task Main()
{
// Taskの実行
Task task1 = Task.Run(() => {
SomeMethod(5000);
});

// Taskの実行
Task task2 = Task.Run(() => {
SomeMethod(3000);
});

// task1, task2が終わるまで待機
await Task.WhenAny(task1, task2);
Console.WriteLine(“”Main終了””);

Console.ReadLine();
}

static void SomeMethod(int millisec)
{
Console.WriteLine(“”SomeMethod “” + millisec + “” 開始””);
Thread.Sleep(millisec);
Console.WriteLine(“”SomeMethod “” + millisec + “” 終了””);
}
}
}

実行結果は以下のようになります。

WhenAnyメソッドでtask1, task2のどちらかが終わるまで待機していることが分かります。

 

このように、C#のTaskではWhenAnyメソッドで複数の非同期処理のうちのいずれか一つの終了待ち合わせができます。

非同期処理の終了状態を取得する

C#のTaskでは、非同期処理の終了状態を取得できます。

 

実際のソースコードを見てみましょう。

namespace ConsoleApplication1
{
class Program
{
static async Task Main()
{
// Taskの実行
Task task1 = Task.Run(() => {
SomeMethod(5000);
});

// Taskの実行
Task task2 = Task.Run(() => {
SomeMethod(3000);
});

// task1, task2が終わるまで待機
await Task.WhenAny(task1, task2);

// task1の完了チェック
if(task1.IsCompleted)
{
Console.WriteLine(“”task1は終了しています””);
} else
{
Console.WriteLine(“”task1は終了していません””);
}

// task2の完了チェック
if (task2.IsCompleted)
{
Console.WriteLine(“”task2は終了しています””);
}
else
{
Console.WriteLine(“”task2は終了していません””);
}

Console.WriteLine(“”Main終了””);

Console.ReadLine();
}

static void SomeMethod(int millisec)
{
Console.WriteLine(“”SomeMethod “” + millisec + “” 開始””);
Thread.Sleep(millisec);
Console.WriteLine(“”SomeMethod “” + millisec + “” 終了””);
}
}

実行結果は以下のようになります。

WhenAnyメソッドで待ち合わせた後に、taskの終了状態を取得しています。

SE
Taskを使って実行結果の取得方法や待ち合わせ方法についてよくわかりました。
PM
Threadではなくても、Taskでも非同期処理が実現できことを覚えておきましょう。

まとめ

いかがでしたでしょうか。C#におけるTaskの使い方について説明しました。

 

Taskを利用すると、非同期処理を実現できます。Taskの基本的な使い方から、実行結果の取得方法、待ち合わせ方法を紹介しました。

 

ぜひご自身でソースコードを書いて、理解を深めてください。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)