まず、通常の処理
Httpリクエストをして結果を返すだけの処理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| using System; using System.Net; using System.Net.Http; using System.Threading.Tasks;
namespace ConsoleApp1 { class Program { static async Task Main(string[] args) { if (await HttpGetAsync("https://www.microsoft.com/")) { Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] リクエストは正常に処理されました。"); } else { Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] エラー"); } }
private static async Task<bool> HttpGetAsync(string requestUri) { using var client = new HttpClient(); var response = await client.GetAsync(requestUri); if (response.StatusCode == HttpStatusCode.OK) { return true; } else { return false; } } } }
|
至ってシンプルです。コレを実行しHttpリクエストが成功すると「リクエストは正常に処理されました。」が表示され、失敗すると「エラー」が表示されます。
成功時

失敗時

処理の修正
この処理に「エラーの場合3回までリトライしたい」「リトライ間隔は3秒間」という機能を盛り込みたい場合、愚直に処理を修正してもいいですが「あまりソースを変えたくない」「他にもリトライ機能を付けたい」となると、ちょっと手間だと思います。
なので、今回は「リトライ機能を持ったヘルパークラス」を作ることにします。
リトライ機能を持ったヘルパークラス
クラスはこんな感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| using System; using System.Threading.Tasks;
namespace ConsoleApp1 { public static class RepeatHelper { private const int MAX_REPEAT = 3; private const int MILLISECONDS_TIMEOUT = 3000;
public static async Task<bool> RepeatProcessAsync(Func<string, Task<bool>> func, string requestUri) { var count = 0; while (count < MAX_REPEAT) { if (count != 0) { // 初回以降インターバルを設定 await Task.Delay(MILLISECONDS_TIMEOUT); }
if (await func(requestUri)) { return true; }
Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] リクエストエラーのため、リトライ処理に入ります。");
count++; }
return false; } } }
|
使い方はこんな感じです。
1 2 3 4 5 6 7 8 9 10 11
| //if (await HttpGetAsync("https://www.microsoft.com/")) // ↓↓↓ // リトライヘルパークラスを使って処理をする。 if (await RetryHelper.RetryProcessAsync(HttpGetAsync, "https://www.microsoft.com/")) { Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] リクエストは正常に処理されました。"); } else { Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] エラー"); }
|
RetryHelper.RetryProcessAsync に、関数と引数を渡して処理します。
このように、3秒間隔でリトライして3回失敗したらエラーになりました。

おわりに
処理を単純に修正するのもいいですが、直感的に分かりやすい処理を目指すのも有りかと思います。
まあ、人それぞれなので強要は出来ませんがね。