Перезапустите внутренний таймер отмены Windows.Web.Http.HttpClient при событии прогресса. - PullRequest
0 голосов
/ 04 мая 2018
    using (var httpClient = new HttpClient(filter))
    {
      using (var httpContent = new HttpStringContent(postBody, UnicodeEncoding.Utf8, content_type))
      {
        var source = new CancellationTokenSource(150000);
        HttpResponseMessage result;
        try
        {
          result = await httpClient.PostAsync(new Uri(url), httpContent).AsTask(source.Token, new Progress<HttpProgress>(
            progress =>
          {
            Debug.WriteLine("Progress");
          }));
        }
        catch (TaskCanceledException e)
        {
          return new ServerRequestResponse(RequestResponseType.Timeout);
        }
        catch (Exception e)
        {
          return new ServerRequestResponse(RequestResponseType.Failure);
        }

        var buffer = await result.Content.ReadAsBufferAsync();
        var byteArray = buffer.ToArray();
        var responseString = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
        return new ServerRequestResponse(RequestResponseType.Success, responseString);
      }
    }

Приведенный выше код вызывает сообщение на сервер и имеет тайм-аут. Что мне нужно сделать, так это перезапустить внутренний счетчик таймаута, как только я получу вызов Progress . Мне нужно, чтобы это было в состоянии определить, продолжается ли передача или она остановлена, поскольку иногда при медленных соединениях это может по праву занять больше времени ожидания.

Есть ли такая функция или мне нужно реализовать собственный таймер, чтобы можно было перезапустить его вручную?

1 Ответ

0 голосов
/ 07 мая 2018

Мне нужно это, чтобы иметь возможность определить, происходит ли передача по-прежнему

Вы не можете определить, продолжается ли передача, и интерфейс IAsyncOperationWithProgress предоставляет только обработчик событий Progress. Вы можете обнаружить прогресс Stage.

httpResponse = await httpClient.GetAsync(requestUri).AsTask(source.Token, new Progress<HttpProgress>((Progress) =>
{
    Debug.WriteLine(Progress.BytesReceived.ToString() + "---" + Progress.Stage);
}));

Тем не менее, вы не можете идентифицировать прогресс, завершенный из вывода.

0------SendingHeaders
0------WaitingForResponse
0------ReceivingHeaders
0------ReceivingContent
65536------ReceivingContent
98304------ReceivingContent
98432------ReceivingContent
98432------ReceivingContent

Вы можете обнаружить прогресс только с HttpStatusCode.

Что мне нужно сделать, так это перезапустить внутренний счетчик тайм-аута после получения вызова Progress.

Значение по умолчанию timeout равно 100 000 миллисекунд (100 секунд) в пределах httpclient. Если вы запрашиваете данные более 100 секунд, вам нужно установить время ожидания вручную.

var cts = new CancellationTokenSource();

......

cts.CancelAfter(2000);
...