Skip to main content
 首页 » 编程设计

C#超时后中止异步HttpWebRequest

2024年02月04日29zhenyulu

我在这里找到了https://stackoverflow.com/a/19215782/4332018将 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 源时,设置取消。然后传入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);