2020年10月05日
川俣晶の縁側ソフトウェアC# コーディング How To total 945 count

【入門級】非同期のハロー・ワールド

Written By: 川俣 晶連絡先

ハロー・ワールドを非同期にできるか? §

 できます。

 そのための問題は2点あります。

  • Mainメソッドを非同期にできるか?
  • Console.WriteLineの非同期版がない

 まずMainメソッドはC#7.1から非同期可になっています。しかし、単にasyncを付ければ良いわけではありません。戻り値の型をvoidからTaskに変更しなければなりません。ここをクリアできれば非同期にできます。

 次に、Console.WriteLineの非同期版がない問題ですが、確かにConsoleクラスにWriteLineAsyncメソッドはありません。ところが、ConsoleクラスのOutプロパティを経由して出力ライターを取得すると、ここにはWriteLineAsyncメソッドがあります。結局同じところに出力するので、これを使っても結果は同じです。

 つまりステップは以下の3点です。

  • Mainメソッドにasyncを付ける
  • Mainメソッドの戻り値をvoidからTaskに変更する (必要ならusing System.Threading.Tasks;も追加する)
  • Console.WriteLineをawait Console.Out.WriteLineAsyncに変更する

罠の数々 §

  • static async void Main()はC#の文法としては間違っていない。しかし、C#のスタートアップメソッドとしては認識されないので、実行できない。文法エラーが起きていないからと言って安心しないようにしよう

参考リンク §

Console クラス

Console.Out プロパティ

TextWriter.WriteLineAsync メソッド

 Console クラスから直接使えない様々な機能をConsole.Out プロパティを経由すると使用できる。WriteLineAsync メソッドはその一部に過ぎない。どんな機能が使用できるか上記リンクから辿って調べてみよう。

リポジトリ §

https://github.com/autumn009/cshowto

async §

using System;

using System.Threading.Tasks;

class Program

{

    static async Task Main()

    {

        await Console.Out.WriteLineAsync("Hello World!");

    }

}

実行結果

Hello World!

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?