重新启动 Windows.Web.Http.HttpClient on progress 事件的内部取消计时器


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);
}
}

上面的代码调用服务器发布并超时。我需要做的是在收到进度呼叫后重新启动内部超时计数器。我需要它才能检测传输是否仍在进行或已停止,因为有时在慢速连接下,它可能会比超时持续时间更长。

是否有这样的功能,或者我需要实现自己的计时器才能手动重新启动它?

我需要它才能检测传输是否仍在进行

您无法检测到传输是否仍在进行,并且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中检测到完成的进度。

我需要做的是在收到进度呼叫后重新启动内部超时计数器。

默认超时值为 httpclient 中的 100,000 毫秒(100 秒(。 如果请求数据超过 100 秒,则需要手动设置超时。

var cts = new CancellationTokenSource();
......
cts.CancelAfter(2000);

最新更新