gpt4 book ai didi

c# - 使用 HttpWebRequest.BeginGetResponse 超时的最佳方法

转载 作者:行者123 更新时间:2023-11-30 12:14:01 24 4
gpt4 key购买 nike

HttpWebRequest.BeginGetResponse 不遵守 HttpWebRequest 的任何超时属性(Timeout 或 ReadWriteTimeout)。

我阅读了一些方法来获得相同的结果,但我不知道这是否是最好的方法,我是否应该使用少量调用或者我可以在循环内扩展它(我正在做一个网络爬虫)。

重要的是,最初我的代码不是异步的,我只需要异步,因为我的方法应该接受 CancellationToken。

我担心的是 WaitHandles 和 ThreadPool.RegisterWaitForSingleObject。这不是日常代码,所以我不知道在不久的将来是否会遇到问题。

private static void HandleCancellation(HttpWebRequest request, IAsyncResult getResponseResult, CancellationToken cancellationToken)
{
using (WaitHandle requestHandle = getResponseResult.AsyncWaitHandle)
{
ThreadPool.RegisterWaitForSingleObject(requestHandle, TimeoutCallback, request, request.Timeout, true);

//If request finish or cancellation is called
WaitHandle.WaitAny(new[] {requestHandle, cancellationToken.WaitHandle});
}

//If cancellation was called
if (cancellationToken.IsCancellationRequested)
{
request.Abort();
cancellationToken.ThrowIfCancellationRequested();
}
}

调用(同样,它不是异步的)

IAsyncResult getResponseResult = request.BeginGetResponse(null, null);

HandleCancellation(request, getResponseResult, cancellationToken);

return (HttpWebResponse)request.EndGetResponse(getResponseResult);

引用:Better approach in management of multiple WebRequest

最佳答案

BeginGetResponse 的 MSDN 文档有一个很好的例子来说明如何处理超时。它在我的网络爬虫中运行良好。

关于c# - 使用 HttpWebRequest.BeginGetResponse 超时的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10497853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com