はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】HttpClient,UnityWebRequestにタイムアウトを設定する方法

はじめに

Unityで通信を行おうと思った場合、HttpClientもしくはUnityWebRequestのどちらかを使うことが多いでしょう。

これらを用いるに当たってタイムアウト処理を設定しておかないと、永遠に処理が終わらないなんてこともあるかもしれません。

今回はそれを回避するためにタイムアウト処理を実装する方法について紹介していきたいと思います。

HttpClientを使った場合

// アプリケーションで一度だけインスタンス化するのが良い
private static HttpClient _client = new HttpClient();

static async Task Main(string[] args)
{
    _client.Timeout = TimeSpan.FromSeconds(3);

    try
    {
        var respose = await _client.GetStringAsync("https://www.hanachiru-blog.com/");
        Console.WriteLine(respose);
    }
    catch (TaskCanceledException e)
    {
        Console.WriteLine("Tasks cancelled: time out.");
        Console.WriteLine($"Message :{e.Message}");
    }
    catch (HttpRequestException e)
    {
        Console.WriteLine("Exception Caught.");
        Console.WriteLine($"Message :{e.Message}");
    }
}

HttpClientにはTimeoutというプロパティが既に備わっているので、そちらを使わせていただきます。

名前 意味
Timeout 要求がタイムアウトするまで待機する期間を取得または設定します。

HttpClient クラス (System.Net.Http) | Microsoft Docs

UnityWebRequestの場合

[UnityTest]
public IEnumerator UnityWebRequestTest()
{
    UnityWebRequest www = UnityWebRequest.Get("https://www.hanachiru-blog.com/");

    // 3秒後に完了していなければタイムアウト
    www.timeout = 3;

    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        Debug.Log(www.error);
        Assert.Fail();
    }
    else
    {
        Debug.Log(www.downloadHandler.text);
    }
}

UnityWebRequenstにはtimeoutという変数が含まれています。
Networking.UnityWebRequest-timeout - Unity スクリプトリファレンス

これを利用すればHttpClientと似たように使うことができますが、iOSだとうまく動作しない?みたいな記事もあったので少し怪しそうです。
地味に必要!UnityにてHTTPリクエストにタイムアウト処理を実装する | Course out

加えてtimeoutは○秒単位での指定らしく,ミリ秒の指定はできなさそうでした。

またUnityWebRequestはメインスレッドでしか呼べない制約があるので要注意です。

さいごに

タイムアウトについて調べている時に、色々な通信の仕方を紹介している記事をみかけました。
yotiky.hatenablog.com

色々な方法を紹介されていますが、基本は今回紹介した2個のどちらかで良いとは思います。

この記事ではヘッダの付け方やバイナリの送信の仕方なども紹介されていたので一度みてみると面白いかもしれません。

今回はこれくらいで。