[解決済み】Task<T>の完了をタイムアウトで非同期に待つ
2022-03-23 11:28:13
質問
を待ちたいのですが。 タスク<T> を、いくつかの特別なルールで完了させます。 Xミリ秒経っても完了しない場合、ユーザーにメッセージを表示したい。 また、Yミリ秒経過しても完了しない場合は、自動的に キャンセル依頼 .
を使うことができますね。 タスク.ContinueWith を使えばタスクの完了を非同期に待つことができます (つまり、タスクが完了したときに実行されるアクションをスケジュールする) が、これではタイムアウトを指定することができないのです。 しかし、これではタイムアウトを指定できません。 タスク.ウェイト を使えば、タスクの完了をタイムアウト付きで同期的に待つことができますが、これでは私のスレッドがブロックされてしまいます。 どうすればタイムアウトを伴うタスクの完了を非同期で待つことができるでしょうか?
解決するには?
こんなのはどうでしょう。
int timeout = 1000;
var task = SomeOperationAsync();
if (await Task.WhenAny(task, Task.Delay(timeout)) == task) {
// task completed within timeout
} else {
// timeout logic
}
追加 : 私の回答に対するコメントで要望がありましたので、キャンセル処理を含む拡大した解決策を紹介します。タスクとタイマーにキャンセルを渡すということは、コードの中でキャンセルを経験する方法が複数あるということで、それらすべてを適切に処理するためのテストと確信が必要です。様々な組み合わせを偶然に任せたり、実行時にコンピュータが正しい動作をすることを願ったりしないようにしましょう。
int timeout = 1000;
var task = SomeOperationAsync(cancellationToken);
if (await Task.WhenAny(task, Task.Delay(timeout, cancellationToken)) == task)
{
// Task completed within timeout.
// Consider that the task may have faulted or been canceled.
// We re-await the task so that any exceptions/cancellation is rethrown.
await task;
}
else
{
// timeout/cancellation logic
}
関連
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] 関数を終了するには?
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み] C#でawaitを使わずに非同期メソッドを安全に呼び出す方法
-
[解決済み】複数の非同期タスクを実行し、すべてのタスクが完了するのを待つ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー