C#による音声の同期・非同期再生


はじめに

この記事は,C#による音声の同期・非同期再生についてまとめた記事である.
主にC#入門者である自分の知識整理のためにまとめたものである.

同期再生・非同期再生とは

同期再生とは,音声の再生が終了まで他の処理を行わない再生方法である.
一方,非同期再生は,音声をバックグラウンドで再生する再生方法であるため,再生後も次の処理を行う.
音声を再生中に他の処理を行いたい場合,同期再生で再生してしまうと音声の再生のみ行われるが,非同期再生だと音声の再生と他の処理が同時に行える.

同期再生

synchro.cs
static string Method1(){
  //処理1を行う
  Thread.Sleep(3000);

  //処理2を行う
  return "hogehoge";
}

static void Method2(){
  //処理1を行う
  Thread.Sleep(3000);

  //処理2を行う
}

static void Main(string[] args){
  string result = Method1();
  Method2();
  Console.WriteLine(result);
  Console.ReadLine();
}

非同期再生

asynchro.cs
static async Task<string> Method1(){
  //処理1を行う
  await Task.Delay(3000);                       //(2)

  //処理2を行う
  return "hogehoge";
}

static void Method2(){
  //処理1を行う
  Thread.Sleep(3000);

  //処理2を行う
}

static async Task Main(string[] args){
  Task<string> task = Method1();                //(1)
  Method2();                                    //(3)
  Console.WriteLine(task.Result);               //(4)
  Console.ReadLine();
}

(1)
関数Method1に入る.
Task型かTask型のジェネリック.
Task型は、非同期メソッドの状態や戻り値を知ることができる.
<>は戻り値の型.

(2)
同期からの変更点.
awaitは、Task型を返す非同期メソッドが終了するまで待つ(3000ms待つ、という非同期メソッド).
awaitが付いているメソッドが実行されると一旦そのメソッドを抜け、メインに戻る
※awaitは戻り値がTask型のメソッドにしか付けることができない.
「Task.Delay」→引数で指定した秒数を待ち,その実行状態をTask型で返す非同期メソッド

(3)
Method1を一旦抜けて実行される.
その間にもTask.Delay(3000)は別スレッドで実行中.
Task.Delay(3000)の処理が終わったら、Method2が途中でもMethod1に戻り、文字列を返す

(4)
asyncメソッドの戻り値はTask型であるため、Resultプロパティで戻り値を取得できる.

おまけ

完全自分用、とりあえずC#での意味を書いてく

クラス

アプリ内の特定の機能を担うかたまり。
文字列や数字すべてのオブジェクトを普遍的に表現、操作できるような雛形のようなもの。
例えば、文字列ならstringというクラスで、数学的機能はMathというクラスで表現する。
Console.WriteLineやConsole.ReadLineはConsoleクラスの静的メソッド(オブジェクトを生成しなくてもクラスから直接呼び出せるメソッドのこと、クラスメソッドとも呼ぶ)である。
あとTaskもクラス。Task型。

メソッド

データを操作するための道具。
クラスの動作や処理、振る舞いを表現するもの。
主に、クラスで管理されているデータ(フィールド)の値を操作するためのもの。
関数と似ているが、厳密には異なるものである。(違いについてはまた今度調べる)
フィールド(変数)とメソッドのことを総称してメンバーという。

修飾子

public→すべてのクラスからアクセス可能
private→同じクラス内からのみアクセス可能(既定)
static→静的メンバーを指定