.net C#

C#のタスクとasync/awaitについて

投稿日:2017年12月16日 更新日:

 

非同期メソッドとasync/awaitキーワード

  • 非同期処理でありながら、コールバック記述をする事なく、awaitキーワードを使って完了待機を記述できる(同期的に記述できる)。
  • 「非同期メソッド」とは シグネチャにasyncを付けた特別なメソッドのことで、asyncで修飾されたメソッドを「非同期メソッド」と呼びます。別の言い方を言えば、awaitしたい場合はasyncでメソッドを修飾して非同期メソッドにしなければならない。
  • async修飾子はただの目印でしかなく、コンパイル結果は通常のメソッドと変わりません。なので、async修飾子を付加したからと言って、そのメソッド内の処理が、別スレッド上で非同期的に動作することにならない。よって、非同期メソッド内のタスク実行以外の処理は、UIスレッドで動作するためコントロールに関する処理を記述できる。
  • async修飾子の意味は、「このメソッドは非同期操作を待つ必要がある制御フロー (await) を含んでおり、非同期処理の適切な時点でこのメソッドを、再度、途中から始められるようにコンパイラによって継続渡しに書き直される」ことを意味する。
  • await演算子の意味は「待っているタスクがまだ完了していない場合、このメソッドの残りをそのタスクの継続として登録して呼び出し元に処理を戻す。タスクが完了したら、タスクは登録しておいた継続を実行する」。「非同期処理が終了するまで呼び出し元スレッドをブロックして待機する」という意味ではないので注意。
  • あるメソッド内(MethodA)の処理内で非同期メソッドを使用する場合、MethodAにasyncキーワードを付加することによって、MethodAを呼び出す側にMethodA内で非同期メソッドが使用されていることを知らせ、MethodAの呼出し側で待たせるor待たせないを選択可能とさせる。
  • 非同期メソッドの戻り値は、通常、Task/Task<T>になる。return task/task<T>のような記述はないが、メソッド内の処理をタスクとして生成して、メソッドの戻り値として返している。async修飾子の付いた関数はreturn文がなくてもUIスレッドをタスク化したもの、もしくは継続タスクが返るよう。非同期メソッドから「return 10;」のように値を返す場合は、戻り値の型をTask<T>型にする必要がある。
  • return文を書かない場合には戻り値にvoidを指定できる。戻り値にvoidを指定するケースは、呼び出し側が非同期メソッドの完了を待機しない場。例えばGUIアプリケーションのイベントハンドラなど。よって、戻り値がvoid型の非同期メソッドは、待機(継続渡し)が実行されない。void型の記述はイベントハンドラへの適用のみに留めるのがベストプラクティスとされている。
  • メソッド内のreturnはタスクの終了を示す。Task<T>の場合はreturn T;でタスクの結果の戻すことができる(Resultプロパティで取得する)。
  • 非同期メソッドの特徴はただ一つ、メソッド内でawaitキーワードを使えるようになること。
  • awaitキーワードの効果は、①「ロックされず指定したTaskの完了を待つ」②「タスク完了後に結果を取り出す」こと。
  • 非同期メソッドとは、複数の「タスク」の実行順序などを記述した「一つのタスク」である。メソッドの記述でタスクを生成している感じ。

 

 

非同期メソッドを待機しない場合の警告を消す方法

  • 非同期メソッドを呼び出す際は、多くの場合 await してその場で待機することが多いですが、待たなくても良い場合もあります。
  • そのような場合、await しなければ良いのですが、ただ await しないだけだと 「この呼び出しを待たないため、現在のメソッドの実行は、呼び出しが完了するまで続行します。呼び出しの結果に ‘await’ 演算子を適用することを検討してください。」 という警告が出てしまう。
  • 警告は消すコーディングの方法について

 

 

参考にさせて頂いたページ

非同期メソッド入門

Taskを極めろ!async/await完全攻略

Async なメソッドを待機しない場合の警告を消してみる

 

 

 

スポンサーリンク

スポンサーリンク

-.net, C#

執筆者:

関連記事

C#のタスク注意事項

  バックグラウンドタスクで発生した例外 タスクの例外処理に関しては、.NET 4.5で大きな仕様変更が発生している。 バックグラウンドタスクの完了を待機する(awaitキーワードやWait ...