半人前プログラマーの技術談議

開発したもの紹介していくブログ

C# 非同期処理編 async Task part1-1

今回はC#の非同期処理について解説,検証してみます.

 

非同期処理とは?

あるタスクが実行している時,別のタスクが別の処理をすること.

図で書くとこんな感じ.

 

f:id:pokoshirou:20180926180233p:plain

 

一応説明してみると

 

非同期処理は,メインタスクの処理中に,サブタスクの処理を並行して処理する事ができる.

 

同期処理は,メインタスクの処理中に,サブタスクの処理が入ったら,サブタスクの処理が完了するまで,メインタスクの処理を待機させることになる.サブタスクの処理が完了後,メインタスクの処理が再開される.(従来のプログラミングと同じです.)

 

 

例えば、こんな事も考えられる.

「音楽を再生させる」という処理を実行する.

 

同期処理なら,音楽の再生が終わるまで何も処理を受け付けられない.

 

非同期処理なら,音楽の再生中でも処理を受け付ける事ができる.

(停止,早送り,巻き戻しなどの処理もできるようになるよね)

 

 

 

 

 

どうやって実装すればいいのか?

始めに

同期メソッドと非同期メソッドについて整理します.

 

同期メソッドとは

恐らく一般的にメソッドというと同期メソッドの事を指してると思います.

一応書き方を説明すると,

 

型名 メソッド名(仮引数) {
    処理;
}

 

※例えば

int Main() {
    return 0;
}
        
double Calc(double num1, double num2) {
    return num1 * num2; 
}

 

これはいつも通りですね

 

 

非同期メソッドとは

様々な書き方があるみたいですが,自分はこの書き方で書いています.

 

async Task<型名> タスク名(仮引数) {
    処理;
}

 

※戻り値がある場合は,

return文で値を返す.

 

※戻り値が無い場合は

async Task タスク名(仮引数)

となる.

 

非同期メソッドを作成するには,asyncという修飾子を付ける必要があります.

Taskは何なのかと言うと,処理の入れ物だと思って貰えればいいと思います.

Taskだけでは非同期処理をしません

 

書き方自体は同期メソッドと似ているので,慣れればそこまで難しくないはずです.

 

最初は,asyncTaskはセットで使うと考えましょう.
(冒頭でも書いたように他にも様々な書き方があります)

 

 

 

 

 

使い方

実装のやり方について解説したので,どんな感じに使うのか検証していきましょう.

早速ですが,ソースコードを載せます

 


static void Main(string[] args)
{
    Console.WriteLine("メインタスクの処理開始");
    Console.WriteLine("メイン1");

    Task.Run(SubTask);  // サブタスクを動かす

    Thread.Sleep(1000); // 1000ミリ秒待機する

    Console.WriteLine("メイン2");

    Thread.Sleep(5000); // 5000ミリ秒待機する

    Console.WriteLine("メイン3");
    Console.WriteLine("メインタスクの処理完了");
}

static async Task SubTask()
{
    Console.WriteLine("サブタスクの処理開始");
    Console.WriteLine("サブ1");

    Thread.Sleep(3000); // 3000ミリ秒待機する 

    Console.WriteLine("サブ2");
    Console.WriteLine("サブタスクの処理完了");
}

 

このプログラムでは,同期メソッド(Mainメソッド)から非同期メソッド(subTaskタスク)を呼び出しています.

 

非同期メソッドの呼び出し方は,

Task.Run(非同期メソッド名);

で呼び出す事ができます!

 

実行結果

f:id:pokoshirou:20180926193950p:plain

 

サブタスクの処理開始から完了までの間に,メインの処理もしていることが確認できました!

 

 

 

 

 

まとめ

基本的な使い方については解説できたんじゃないかと思います.

次回はawaitの使い方,SleepとDelayの違いなど,メソッドについて解説検証しようと思ってます!

 

まだまだ書き慣れないので,不備とかあると思いますが,コメントなどで指摘して頂けたら幸いです(´・ω・`)

 

では!