首页 新闻 会员 周边

有没有朋友用过async await的异步http?,超时是无效的。是何原因或原理?

0
悬赏园豆:50 [已关闭问题] 解决于 2013-07-15 19:39
async Task<string> DDD()
        {
            var req = WebRequest.Create("http://www.nipusa.net/x.php");
                req.Timeout = 1; // ま、このTimeoutはイミナイですよ 
                var res = await req.GetResponseAsync();
                return await new StreamReader(res.GetResponseStream()).ReadToEndAsync();
        }
        async void button1_Click(object sender, EventArgs e)
        {
            while (true)
            {
                try
                {
                    string sss = await DDD();
                    richTextBox1.Text += sss;
                }
                catch (WebException ex)
                {
                    string s = "a";
                }
            }
        }

上边代码是精简的。我用php建了个页面。在页面里sleep了60多秒。我发现超时并不生效。同步没有问题。我也不想换成httpclient。现在用的是扩展Task<T>与Task的方法实现超时。但我想知道原因。

  因为在一个爬虫中。总是在访问一些网址的时候“死掉”。也不返回。开始以为死锁。后来发现死锁的可能性不大。因为死锁的话。不可能会运行一两个小时再死。而且加入超时后。6个多少时过去了。没有“死掉”现象。那多半是超时引起的“死掉”

  当然。上边的代码在php页面sleep完成输出后能获取输出值。但如果这个页面一直不返回。它也一直不返回。

  原理原因何在?原理原因何在?原理原因何在?原理原因何在?原理原因何在?原理原因何在?

问题补充:
var req = WebRequest.CreateHttp(uri);// as HttpWebRequest;
            req.Proxy = null;
            req.AllowAutoRedirect = AutoRedirect;
            req.Timeout = ConnTimeout;
            req.ReadWriteTimeout = RWTimeout;

我精简了代码试的。连接与读取超时我都是设了的。

gnhao的主页 gnhao | 初学一级 | 园豆:9
提问于:2013-07-14 19:39
< >
分享
其他回答(1)
0

超时~指的是在创建连接时,超过了指定的时间,是没有连接上的时间,而不是下载时间,

如果你想做超时的话.需要自己做,

http://www.cnblogs.com/jiangming/archive/2012/09/02/TimeOutManager.html
你自己看一下吧,这个是我做的超时~

收获园豆:25
只会造轮子 | 园豆:2274 (老鸟四级) | 2013-07-15 11:19

@imfunny: 超时绝对无效的。我在google上找到了别人自己扩展的超时。我上边的代码换成同步。立马超时异常。

  public static class TaskExt
    {

        public static async Task Timeout(this Task task, TimeSpan timeout, string msg = "")
        {
            var delay = Task.Delay(timeout);
            if (await Task.WhenAny(task, delay) == delay)
            {
                throw new TimeoutException(msg);
            }
        }

        public static async Task<T> Timeout<T>(this Task<T> task, TimeSpan timeout,string msg="")
        {
            await ((Task)task).Timeout(timeout,msg);
            return await task;
        }
    }

目前我用的扩展实现超时。我想知道原因。我用reflector看了源码。内部还是调用的begin end对来实现的异步。

支持(0) 反对(0) gnhao | 园豆:9 (初学一级) | 2013-07-15 11:22

@gnhao: 
你代码中的  req.Timeout = 1;  这句,指的是请求连接超时时间,并不是下载超时时间
我没有用过你发的这个超时组件,所以我也不太清楚,

因为超时功能必须是使用两个线程以上能可能做到的,所以超时的组件肯定都是异步的,同步肯定会出问题的.

支持(0) 反对(0) 只会造轮子 | 园豆:2274 (老鸟四级) | 2013-07-15 11:31
0

The Timeout property has no effect on asynchronous requests made with the BeginGetResponse or BeginGetRequestStream method.

Charltsing | 园豆:204 (菜鸟二级) | 2016-11-02 07:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册