非同期操作を構成する方法を探しています。最終的な目標は、非同期操作を実行し、完了まで実行するか、ユーザー定義のタイムアウト後に戻ることです。
例として、次のコルーチンを組み合わせる方法を探しているとします1 :
IAsyncOperation<IBuffer> read(IBuffer buffer, uint32_t count)
{
auto&& result{ co_await socket_.InputStream().ReadAsync(buffer, count, InputStreamOptions::None) };
co_return result;
}
インスタンスでsocket_
あることStreamSocket
。
そして、タイムアウト コルーチン:
IAsyncAction timeout()
{
co_await 5s;
}
これらのコルーチンを組み合わせて、データが読み取られるか、タイムアウトが経過すると、できるだけ早く戻る方法を探しています。
これまでに評価したオプションは次のとおりです。
- C++20 コルーチン: P1056R0を理解している限り、現在、 「コルーチンの作成と構成を可能にする」ライブラリまたは言語機能はありません。
- Windows ランタイムが提供する非同期タスク タイプは、最終的にはIAsyncInfoから派生します。繰り返しますが、必要な方法でタスクを組み合わせることができる機能は見つかりませんでした。
- 同時実行ランタイム: これは有望に見えます。特に
when_any
関数テンプレートはまさに私が必要としているものです。
そのことから、同時実行ランタイムを使用する必要があるようです。とはいえ、すべてのパーツを揃えるのは難しい。例外を処理する方法と、それぞれの他の同時タスクのキャンセルが必要かどうかについて、特に混乱しています。
質問は 2 つあります。
- コンカレンシー ランタイムは唯一のオプションですか (UWP アプリケーション)?
- 実装はどのようになりますか?
1 メソッドはアプリケーションの内部にあります。Windows ランタイムと互換性のある型を返す必要はありません。