待機可能な Thread.Sleep を取得するにはどうすればいいですか? 質問する

待機可能な Thread.Sleep を取得するにはどうすればいいですか? 質問する

私は await/sleep パラダイムに基づいてネットワーク バウンド アプリケーションを作成しています。

時々、接続エラーが発生することがありますが、私の経験では、しばらく待ってから操作を再試行すると効果的です。

問題は、await/async で Thread.Sleep または同様のブロッキング操作を使用すると、呼び出し元スレッドのすべてのアクティビティがブロックされることです。

同じ効果を得るには、Thread.Sleep(10000)を何に置き換えるべきでしょうか?

await Thread.SleepAsync(10000)

?

アップデート

追加のスレッドを作成せずにこれを行う回答を希望します

ベストアンサー1

新しいスレッドを開始することを提案する他の回答は悪い考えです。そうする必要はまったくありません。/ の目的の一部は、asyncアプリケーションに必要なスレッドの数を減らすawaitことです。

代わりに、新しいスレッドを必要とせずTask.Delay、まさにこの目的のために設計された を使用する必要があります。

// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);

このソリューションには、キャンセル トークンが提供されている場合にキャンセルを許可するという利点もあります。例:

public async Task DoWork(CancellationToken token)
{
    await Task.Delay(1000, token);
}

おすすめ記事