ニートが学ぶ非同期処理 Awaitableなオブジェクトを作る

はいどーもこんにちは、人生も非同期に進みませんかね。
ちょいちょい別の作業をしながらだったのでUniRxほどの勢いでは進んでいませんが、非同期処理の学習も大詰めです。
ちゅーわけで本日はAwaitableなオブジェクトを作ってみたいと思います。
参考にする記事はこちらのものです。
https://ufcpp.net/study/csharp/sp5_awaitable.html

Awaitableなオブジェクトってなに

Awaitableなオブジェクトとは、awaitできるオブジェクトのことです(async/awaitのawait)。
「え? awaitってTaskのためのものじゃないの?」と思ったのですが、別にそういうわけではなく、Awaitableなオブジェクトなら何でもawaitできるみたいです。
AwaitableなオブジェクトはT GetAwaiterメソッドを実装している必要があるようです。
このGetAwaiterメソッドの返すクラスTは以下のメソッドとプロパティを持っていなければならないようです。

・bool IsCompleted { get; }
・void OnCompleted(Action continuation)
・T GetResult()

参照記事によれば「インターフェイスなどの実装も不要で、いわゆる「ダックタイピング」的」とのことです。
JavaScriptでよくやるアレですね。

とりあえず実装してみる

というわけで実装してみます。
まずはAwaiter側(GetAwaiterメソッドの返すクラスT)を作ってみます。
よくわからんのですが、こんな感じですかね。

INotifyCompletionインターフェイスを実装させています。
先ほど「インターフェイスなどの実装も不要」とあったのですが、どうもINotifyCompletionインターフェイスを実装させないとエラーが出ました。

さてAwaitableの方はこんな感じ。

あとはawaitするメソッドを作成すればOKです。

こんな感じですね。
resultには「結果ですよ」が入っています。

終わりに

これが何の役に立つんやということなのですが、async/awaitがどんな風に作られているかを知ることは今後役に立つかもしれないなーくらいの気持ちで勉強してみましたw
実際に僕がAwaitableオブジェクトを作るとかはたぶんないでしょう……。

ほなそんな感じでまた。

フォローする