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;
我精简了代码试的。连接与读取超时我都是设了的。
超时~指的是在创建连接时,超过了指定的时间,是没有连接上的时间,而不是下载时间,
如果你想做超时的话.需要自己做,
http://www.cnblogs.com/jiangming/archive/2012/09/02/TimeOutManager.html
你自己看一下吧,这个是我做的超时~
@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对来实现的异步。
@gnhao:
你代码中的 req.Timeout = 1; 这句,指的是请求连接超时时间,并不是下载超时时间
我没有用过你发的这个超时组件,所以我也不太清楚,
因为超时功能必须是使用两个线程以上能可能做到的,所以超时的组件肯定都是异步的,同步肯定会出问题的.
The Timeout property has no effect on asynchronous requests made with the BeginGetResponse or BeginGetRequestStream method.