private IEnumerator LoadTextAsync(WebPostTask task) { int timeout = 60; TimeoutTask timeoutTask = new TimeoutTask((float)timeout, delegate() { if (task != null && task.IsRunning) { FMLogger.vCore("LoadTextAsync timeout"); task.Result(false, null); } }); timeoutTask.Run(); for (int i = 0; i < task.BaseUrls.Length; i++) { using (UnityWebRequest www = UnityWebRequest.Post(task.BaseUrls[i] + task.RelativeUrl, task.Data)) { yield return(www.Send()); if (task == null || !task.IsRunning) { yield break; } if (!www.isNetworkError && www.responseCode == 200L) { string text = www.downloadHandler.text; if (!string.IsNullOrEmpty(text)) { timeoutTask.Cancel(); task.Result(true, text); } else { timeoutTask.Cancel(); task.Result(false, null); } this.SendConnectionResume(); yield break; } } } if (task.IsRunning) { timeoutTask.Cancel(); task.Result(false, null); } this.SendConnectionError(); yield break; }
/// <inheritdoc /> public Task <Geoposition> GetGeopositionAsync(TimeSpan maximumAge, TimeSpan timeout) { // Setting the timeout on the Windows API to a year as an exception is thrown when it times out. var getPositionTask = this.Locator.GetGeopositionAsync(maximumAge, TimeSpan.FromDays(365)); // Creating a specific timeout task to handle this in a nicer way. var timeoutTask = new TimeoutTask(timeout, getPositionTask.Cancel); var tcs = new TaskCompletionSource <Geoposition>(); getPositionTask.Completed = (op, s) => { timeoutTask.Cancel(); switch (s) { case AsyncStatus.Canceled: tcs.SetCanceled(); break; case AsyncStatus.Completed: this.LastKnownPosition = op.GetResults().ToLocalGeoposition(); tcs.SetResult(this.LastKnownPosition); break; case AsyncStatus.Error: tcs.SetException(op.ErrorCode); break; } }; return(tcs.Task); }