はじめに
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 | 要求がタイムアウトするまで待機する期間を取得または設定します。 |
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個のどちらかで良いとは思います。
この記事ではヘッダの付け方やバイナリの送信の仕方なども紹介されていたので一度みてみると面白いかもしれません。
今回はこれくらいで。