c#超时后中止异步HttpWebRequest
c# abort async HttpWebRequest after timeout
我在这里 找到了一个很好的解决方案,可以将 CancellationToken
与 async HttpWebRequest
一起使用:
public static class Extensions
{
public static async Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request, CancellationToken ct)
{
using (ct.Register(() => request.Abort(), useSynchronizationContext: false))
{
try
{
var response = await request.GetResponseAsync();
return (HttpWebResponse)response;
}
catch (WebException ex)
{
// WebException is thrown when request.Abort() is called,
// but there may be many other reasons,
// propagate the WebException to the caller correctly
if (ct.IsCancellationRequested)
{
// the WebException will be available as Exception.InnerException
throw new OperationCanceledException(ex.Message, ex, ct);
}
// cancellation hasn't been requested, rethrow the original WebException
throw;
}
}
}
}
但是我不明白如果执行时间超过预设时间我怎么能中止request
。
我知道 CancellationTokenSource()
和 CancelAfter(Int32)
,但不明白如何修改上面的示例以使用 CancellationTokenSource
,因为它没有 Register
方法.
我怎样才能制作一个async HttpWebRequest
并且可以在预设时间后取消?
创建令牌源时,设置取消。然后传入token。它应该超时。
CancellationTokenSource cts = new CancellationTokenSource();
cts.CancelAfter(1000);
var ct = cts.Token;
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.zzz.com/here");
var test = Extensions.GetResponseAsync(httpWebRequest, ct);
希望对你有所帮助
_cancelTasks = new CancellationTokenSource();
string Response = null;
var task = new Task(() => {
try
{
using (var wb = new WebClient())
{
var data = new NameValueCollection();
data["XMLString"] = XMLRequest;
var response = wb.UploadValues(ServiceURL, "POST", data);
}
}
catch (Exception ex)
{
}
}, _cancelTasks.Token);
task.Start();
if (!task.Wait(GWRequestTimeout * 1000))
{
_cancelTasks.Cancel();
}
我在这里 找到了一个很好的解决方案,可以将 CancellationToken
与 async HttpWebRequest
一起使用:
public static class Extensions
{
public static async Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request, CancellationToken ct)
{
using (ct.Register(() => request.Abort(), useSynchronizationContext: false))
{
try
{
var response = await request.GetResponseAsync();
return (HttpWebResponse)response;
}
catch (WebException ex)
{
// WebException is thrown when request.Abort() is called,
// but there may be many other reasons,
// propagate the WebException to the caller correctly
if (ct.IsCancellationRequested)
{
// the WebException will be available as Exception.InnerException
throw new OperationCanceledException(ex.Message, ex, ct);
}
// cancellation hasn't been requested, rethrow the original WebException
throw;
}
}
}
}
但是我不明白如果执行时间超过预设时间我怎么能中止request
。
我知道 CancellationTokenSource()
和 CancelAfter(Int32)
,但不明白如何修改上面的示例以使用 CancellationTokenSource
,因为它没有 Register
方法.
我怎样才能制作一个async HttpWebRequest
并且可以在预设时间后取消?
创建令牌源时,设置取消。然后传入token。它应该超时。
CancellationTokenSource cts = new CancellationTokenSource();
cts.CancelAfter(1000);
var ct = cts.Token;
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.zzz.com/here");
var test = Extensions.GetResponseAsync(httpWebRequest, ct);
希望对你有所帮助
_cancelTasks = new CancellationTokenSource();
string Response = null;
var task = new Task(() => {
try
{
using (var wb = new WebClient())
{
var data = new NameValueCollection();
data["XMLString"] = XMLRequest;
var response = wb.UploadValues(ServiceURL, "POST", data);
}
}
catch (Exception ex)
{
}
}, _cancelTasks.Token);
task.Start();
if (!task.Wait(GWRequestTimeout * 1000))
{
_cancelTasks.Cancel();
}