Webclient在下载请求时无法设置请求超时时间和请求读写超时时间。WebClient在异步下载时遇到网络不通等问题时没有响应超时造成app挂起。
1.Webclient请求超时设置
重写Webclient的GetWebRequest方法,为HttpWebRequest添加请求超时及读写超时

protected override WebRequest GetWebRequest(Uri address)

{

HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);

request.Timeout = 1000 * Timeout;

request.ReadWriteTimeout = 1000 * Timeout;

return request;

}
2.WebClient在异步下载
创建计时器监视响应情况,过期则取消下载

public class Calculagraph

{

/// <summary>

/// 时间到事件

/// </summary>

public event TimeoutCaller TimeOver;


/// <summary>

/// 开始时间

/// </summary>

private DateTime _startTime;

private TimeSpan _timeout = new TimeSpan(0, 0, 10);

private bool _hasStarted = false;

object _userdata;


/// <summary>

/// 计时器构造方法

/// </summary>

/// <param name="userdata">计时结束时回调的用户数据</param>

public Calculagraph(object userdata)

{

TimeOver += new TimeoutCaller(OnTimeOver);

_userdata = userdata;

}


/// <summary>

/// 超时退出

/// </summary>

/// <param name="userdata"></param>

public virtual void OnTimeOver(object userdata)

{

Stop();

}


/// <summary>

/// 过期时间(秒)

/// </summary>

public int Timeout

{

get

{

return _timeout.Seconds;

}

set

{

if (value <= 0)

return;

_timeout = new TimeSpan(0, 0, value);

}

}


/// <summary>

/// 是否已经开始计时

/// </summary>

public bool HasStarted

{

get

{

return _hasStarted;

}

}


/// <summary>

/// 开始计时

/// </summary>

public void Start()

{

Reset();

_hasStarted = true;

Thread th = new Thread(WaitCall);

th.IsBackground = true;

th.Start();

}


/// <summary>

/// 重置

/// </summary>

public void Reset()

{

_startTime = DateTime.Now;

}


/// <summary>

/// 停止计时

/// </summary>

public void Stop()

{

_hasStarted = false;

}


/// <summary>

/// 检查是否过期

/// </summary>

/// <returns></returns>

private bool checkTimeout()

{

return (DateTime.Now - _startTime).Seconds >= Timeout;

}


private void WaitCall()

{

try

{

//循环检测是否过期

while (_hasStarted && !checkTimeout())

{

Thread.Sleep(1000);

}

if (TimeOver != null)

TimeOver(_userdata);

}

catch (Exception)

{

Stop();

}

}

}


/// <summary>

/// 过期时回调委托

/// </summary>

/// <param name="userdata"></param>

public delegate void TimeoutCaller(object userdata);

public class CNNWebClient : WebClient

{


private Calculagraph _timer;

private int _timeOut = 10;


/// <summary>

/// 过期时间

/// </summary>

public int Timeout

{

get

{

return _timeOut;

}

set

{

if (value <= 0)

_timeOut = 10;

_timeOut = value;

}

}


/// <summary>

/// 重写GetWebRequest,添加WebRequest对象超时时间

/// </summary>

/// <param name="address"></param>

/// <returns></returns>

protected override WebRequest GetWebRequest(Uri address)

{

HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);

request.Timeout = 1000 * Timeout;

request.ReadWriteTimeout = 1000 * Timeout;

return request;

}


/// <summary>

/// 带过期计时的下载

/// </summary>

public void DownloadFileAsyncWithTimeout(Uri address, string fileName, object userToken)

{

if (_timer == null)

{

_timer = new Calculagraph(this);

_timer.Timeout = Timeout;

_timer.TimeOver += new TimeoutCaller(_timer_TimeOver);

this.DownloadProgressChanged += new DownloadProgressChangedEventHandler(CNNWebClient_DownloadProgressChanged);

}


DownloadFileAsync(address, fileName, userToken);

_timer.Start();

}


/// <summary>

/// WebClient下载过程事件,接收到数据时引发

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

void CNNWebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)

{

_timer.Reset();//重置计时器

}


/// <summary>

/// 计时器过期

/// </summary>

/// <param name="userdata"></param>

void _timer_TimeOver(object userdata)

{

this.CancelAsync();//取消下载

}

}
- ecshop运行超过30秒超时的限制解决办法
ecshop运行超过30秒超时的限制解决办法 ECSHOP模板/ecshop开发中心(www.68ecshop.com) / 2014-06-04 ecshop运行超过服务器默认的设置30秒的限制时会 ...
- pip 安装出现超时问题的解决
pip 安装出现超时问题的解决 我们在用默认的pip源进行安装python库时,会出现超时问题下载不了,如下图显示所示: 那么我们应该如何解决呢? 方法: 在自己电脑的 C:\Users\yanji ...
- C# WebClient 无法设置超时时间的解决办法
http://www.lenashane.com/article/20150624-1021.html
- ssh超时断开的解决方法
当用SSH Secure Shell连接Linux时,如果几分钟没有任何操作,连接就会断开,必须重新登陆才行,每次都重复相同的操作,很是烦人,本文总结了两种解决的方法. 方法1:更改ssh服务器的配置 ...
- Github网站加载不完全,响应超时,如何解决
Github是一个代码托管平台和开发者社区,开发者可以在Github上创建自己的开源项目并与其他开发者协作编码.毫不夸张地说,高效利用Github是一个优秀的程序员必备的基本素质.可是,有的用户在打开 ...
- ssh登录等待时间超时问题的解决
最近使用ssh登录服务器时,发现许多服务器会报告等待时间超时的错误,通过网上查找发现是由于ssh中的配置中开启了DNS反查的功能,导致在反查过程中消耗了很长的时间,现将解决方法总结如下: 使用root ...
- 一个有意思的Ruby Webdriver超时问题的解决过程
rescue in receive 由于写ruby的时候感觉混身上下都拽起来了,所以比較喜欢用ruby写代码. 今天遇到了一个webdriver timeout的问题,问题本身还是由于我对webdri ...
- 连接FastDFS出现超时问题的解决办法
1.使用Java语言写的web项目,jeecg框架连接FastDFS,需要修改的信息如下: # WEB-INF/classes/fdfs_client.conf connect_timeout=300 ...
- SSH 超时断开连接解决办法
配置服务器端: vi /etc/ssh/sshd.conf ClientAliveInterval 120 #以秒为单位(可以改大些) ClientAliveCountMax 0 #发现客户端没有相应 ...
- (转)C#中的泛型
来源:http://www.cnblogs.com/JimmyZhang/archive/2008/12/17/1356727.html .Net 1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持 ...
- 消除热块(hot block)
上篇日志提到了,那么高的负载,是存在数据块读竞争,下面介绍几个方法来消除块竟争 查找块竟争 SELECT p1 "file#", p2 "block#", p3 ...
- sqlserver2008安装出现跨语言
我在安装sqlserver2008的时候出现了一个问题,安装到一半的时候出现 跨语言安装失败 ,我细细的查了下问题,我装的安装语言绝对没有错的吧,然后我后退几步又是同样的错误,最后我把镜像重新加载到虚 ...
- js小分享
之前实现一些js代码时,总觉得无法下手,所以最近在学习一下特别细的知识点,分享笔记.嘻嘻,偷个小懒,我把自己的笔记拍个照片就不打字了.嘎嘎,放心放心,自觉得字写的还算ok的啦- 表示家里的老弟玩游戏, ...
- QT UI 如果发现布局之后,button不在父widget的中间
如果发现布局之后,button不在父widget的中间: 调整父widget的布局参数:
- macbook pro retina 编程字体推荐
使用VS2010.VS2012.Qt Creator编译工具首推等宽字体,等宽字体中consolas. 首先大家都知道等宽对于编码来说的直观性不言而喻,其次retina屏幕的特殊性,整天用特别小的字体 ...
- ACM YTU 《挑战编程》第一章 入门 Problem E: Graphical Editor
Description Graphical editors such as Photoshop allow us to alter bit-mapped images in the same way ...
- [Machine Learning] 梯度下降(BGD)、随机梯度下降(SGD)、Mini-batch Gradient Descent、带Mini-batch的SGD
一.回归函数及目标函数 以均方误差作为目标函数(损失函数),目的是使其值最小化,用于优化上式. 二.优化方式(Gradient Descent) 1.最速梯度下降法 也叫批量梯度下降法Batch Gr ...
- 一. 什么是ANR?为什么会有ANR发生?
对于Android平台的工程师来说,ANR应该是每个人都会遇到的问题,因为导致它的原因有很多,例如在主线程进行耗时操作,调用大量cpu资源进行复杂的预算等,并且可能在大多数情况下,这类问题不会发生,只 ...
- linux用户管理,linux用户口令管理,linux用户组管理,linux用户权限管理详解
linux用户管理 http://www.qq210.com/shoutu/android 用户账号的添加(新加用户需添加用户口令) :增加用户账号就是在/etc/passwd文件中为新用户增加一条记 ...