コード例 #1
0
    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;
    }
コード例 #2
0
        /// <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);
        }