ハロー・ワールドを非同期にできるか? §
できます。
そのための問題は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!