gpt4 book ai didi

iis - 如何在 HttpWebRequest.BeginGetResponse 上指定超时值而不阻塞线程

转载 作者:行者123 更新时间:2023-12-01 16:25:23 24 4
gpt4 key购买 nike

我正在尝试异步发出网络请求。我的代码工作正常,除了一件事:似乎没有内置方法可以在 BeginGetResponse 上指定超时。 MSDN 示例清楚地显示了一个工作示例,但其缺点是它们最终都以

SomeObject.WaitOne()

这再次清楚地表明它会阻塞线程。我将处于高负载环境中,不能有阻塞,但如果请求时间超过 2 秒,我还需要超时。由于无法创建和管理单独的线程池,框架中是否已有某些内容可以帮助我?

起始示例:

我想要的是一种在超时参数到期后调用 BeginGetResponse() 上的异步回调的方法,并指示发生超时。

看似明显的TimeOut参数在异步调用中并不被接受。在响应返回之前,ReadWriteTimeout 参数不会发挥作用。非专有解决方案会更好。

编辑:

这就是我的想法:调用 BeginGetResponse 后,我用我的持续时间创建一个 Timer,这就是处理“开始”阶段的结束。现在要么请求完成并且我的“结束”阶段将被调用,要么超时期限将到期。

为了检测比赛并确定一个获胜者,我称以线程安全的方式增加“已完成”计数器。如果“超时”是第一个返回的事件,我将中止请求并停止计时器。在这种情况下,当调用“end”时,EndGetResponse 会引发错误。如果“结束”阶段首先发生,它会增加计数器,并且“超时”会放弃中止请求。

这似乎像我想要的那样工作,同时还提供了可配置的超时。缺点是额外的计时器对象和我不努力避免的回调。我看到 1-3 个线程正在处理各个部分(开始、超时、结束),所以看起来这很有效。而且我没有任何“等待”电话。

我是否错过了太多 sleep ,或者我是否找到了一种方法来满足我的请求而不阻塞?

int completed = 0;

this.Request.BeginGetResponse(GotResponse, this.Request);
this.timer = new Timer(Timedout, this, TimeOutDuration, Timeout.Infinite);

private void Timedout(object state)
{
if (Interlocked.Increment(ref completed) == 1)
{
this.Request.Abort();
}
this.timer.Change(Timeout.Infinite, Timeout.Infinite);
this.timer.Dispose();
}

private void GotRecentSearches(IAsyncResult result)
{
Interlocked.Increment(ref completed);
}

最佳答案

您可以使用 BackgroundWorker将您的 HttpWebRequest 运行到一个单独的线程中,这样您的主线程仍然处于事件状态。因此,这个后台线程将被阻止,但第一个线程不会。

在此上下文中,您可以使用ManualResetEvent.WaitOne(),就像该示例中的那样:HttpWebRequest.BeginGetResponse()方法。

关于iis - 如何在 HttpWebRequest.BeginGetResponse 上指定超时值而不阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2122499/

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