WebClient的超时问题及解决

WebClient的超时问题及解决

转自:http://blog.163.com/xiaozhi797@126/blog/static/62440288201112245345838/

 

Webclient在下载请求时无法设置请求超时时间和请求读写超时时间。WebClient在异步下载时遇到网络不通等问题时没有响应超时造成app挂起。

1.Webclient请求超时设置
      重写Webclient的GetWebRequest方法,为HttpWebRequest添加请求超时及读写超时

WebClient的超时问题及解决        protected override WebRequest GetWebRequest(Uri address)
WebClient的超时问题及解决        {
WebClient的超时问题及解决            HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
WebClient的超时问题及解决            request.Timeout = 1000 * Timeout;
WebClient的超时问题及解决            request.ReadWriteTimeout = 1000 * Timeout;
WebClient的超时问题及解决            return request;
WebClient的超时问题及解决        }

2.WebClient在异步下载

创建计时器监视响应情况,过期则取消下载

WebClient的超时问题及解决    public class Calculagraph
WebClient的超时问题及解决    {
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 时间到事件
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        public event TimeoutCaller TimeOver;
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 开始时间
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        private DateTime _startTime;
WebClient的超时问题及解决        private TimeSpan _timeout = new TimeSpan(0, 0, 10);
WebClient的超时问题及解决        private bool _hasStarted = false;
WebClient的超时问题及解决        object _userdata;
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 计时器构造方法
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        /// <param name="userdata">计时结束时回调的用户数据</param>
WebClient的超时问题及解决        public Calculagraph(object userdata)
WebClient的超时问题及解决        {
WebClient的超时问题及解决            TimeOver += new TimeoutCaller(OnTimeOver);
WebClient的超时问题及解决            _userdata = userdata;
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 超时退出
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        /// <param name="userdata"></param>
WebClient的超时问题及解决        public virtual void OnTimeOver(object userdata)
WebClient的超时问题及解决        {
WebClient的超时问题及解决            Stop();
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 过期时间(秒)
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        public int Timeout
WebClient的超时问题及解决        {
WebClient的超时问题及解决            get
WebClient的超时问题及解决            {
WebClient的超时问题及解决                return _timeout.Seconds;
WebClient的超时问题及解决            }
WebClient的超时问题及解决            set
WebClient的超时问题及解决            {
WebClient的超时问题及解决                if (value <= 0)
WebClient的超时问题及解决                    return;
WebClient的超时问题及解决                _timeout = new TimeSpan(0, 0, value);
WebClient的超时问题及解决            }
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 是否已经开始计时
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        public bool HasStarted
WebClient的超时问题及解决        {
WebClient的超时问题及解决            get
WebClient的超时问题及解决            {
WebClient的超时问题及解决                return _hasStarted;
WebClient的超时问题及解决            }
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 开始计时
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        public void Start()
WebClient的超时问题及解决        {
WebClient的超时问题及解决            Reset();
WebClient的超时问题及解决            _hasStarted = true;
WebClient的超时问题及解决            Thread th = new Thread(WaitCall);
WebClient的超时问题及解决            th.IsBackground = true;
WebClient的超时问题及解决            th.Start();
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 重置
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        public void Reset()
WebClient的超时问题及解决        {
WebClient的超时问题及解决            _startTime = DateTime.Now;
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 停止计时
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        public void Stop()
WebClient的超时问题及解决        {
WebClient的超时问题及解决            _hasStarted = false;
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 检查是否过期
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        /// <returns></returns>
WebClient的超时问题及解决        private bool checkTimeout()
WebClient的超时问题及解决        {
WebClient的超时问题及解决            return (DateTime.Now - _startTime).Seconds >= Timeout;
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        private void WaitCall()
WebClient的超时问题及解决        {
WebClient的超时问题及解决            try
WebClient的超时问题及解决            {
WebClient的超时问题及解决                //循环检测是否过期
WebClient的超时问题及解决                while (_hasStarted && !checkTimeout())
WebClient的超时问题及解决                {
WebClient的超时问题及解决                    Thread.Sleep(1000);
WebClient的超时问题及解决                }
WebClient的超时问题及解决                if (TimeOver != null)
WebClient的超时问题及解决                    TimeOver(_userdata);
WebClient的超时问题及解决            }
WebClient的超时问题及解决            catch (Exception)
WebClient的超时问题及解决            {
WebClient的超时问题及解决                Stop();
WebClient的超时问题及解决            }
WebClient的超时问题及解决        }
WebClient的超时问题及解决    }
WebClient的超时问题及解决
WebClient的超时问题及解决    /// <summary>
WebClient的超时问题及解决    /// 过期时回调委托
WebClient的超时问题及解决    /// </summary>
WebClient的超时问题及解决    /// <param name="userdata"></param>
WebClient的超时问题及解决    public delegate void TimeoutCaller(object userdata);
WebClient的超时问题及解决    public class CNNWebClient : WebClient
WebClient的超时问题及解决    {
WebClient的超时问题及解决
WebClient的超时问题及解决        private Calculagraph _timer;
WebClient的超时问题及解决        private int _timeOut = 10;
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 过期时间
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        public int Timeout
WebClient的超时问题及解决        {
WebClient的超时问题及解决            get
WebClient的超时问题及解决            {
WebClient的超时问题及解决                return _timeOut;
WebClient的超时问题及解决            }
WebClient的超时问题及解决            set
WebClient的超时问题及解决            {
WebClient的超时问题及解决                if (value <= 0)
WebClient的超时问题及解决                    _timeOut = 10;
WebClient的超时问题及解决                _timeOut = value;
WebClient的超时问题及解决            }
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 重写GetWebRequest,添加WebRequest对象超时时间
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        /// <param name="address"></param>
WebClient的超时问题及解决        /// <returns></returns>
WebClient的超时问题及解决        protected override WebRequest GetWebRequest(Uri address)
WebClient的超时问题及解决        {
WebClient的超时问题及解决            HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
WebClient的超时问题及解决            request.Timeout = 1000 * Timeout;
WebClient的超时问题及解决            request.ReadWriteTimeout = 1000 * Timeout;
WebClient的超时问题及解决            return request;
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 带过期计时的下载
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        public void DownloadFileAsyncWithTimeout(Uri address, string fileName, object userToken)
WebClient的超时问题及解决        {
WebClient的超时问题及解决            if (_timer == null)
WebClient的超时问题及解决            {
WebClient的超时问题及解决                _timer = new Calculagraph(this);
WebClient的超时问题及解决                _timer.Timeout = Timeout;
WebClient的超时问题及解决                _timer.TimeOver += new TimeoutCaller(_timer_TimeOver);
WebClient的超时问题及解决                this.DownloadProgressChanged += new DownloadProgressChangedEventHandler(CNNWebClient_DownloadProgressChanged);
WebClient的超时问题及解决            }
WebClient的超时问题及解决
WebClient的超时问题及解决            DownloadFileAsync(address, fileName, userToken);
WebClient的超时问题及解决            _timer.Start();
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// WebClient下载过程事件,接收到数据时引发
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        /// <param name="sender"></param>
WebClient的超时问题及解决        /// <param name="e"></param>
WebClient的超时问题及解决        void CNNWebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
WebClient的超时问题及解决        {
WebClient的超时问题及解决            _timer.Reset();//重置计时器
WebClient的超时问题及解决        }
WebClient的超时问题及解决
WebClient的超时问题及解决        /// <summary>
WebClient的超时问题及解决        /// 计时器过期
WebClient的超时问题及解决        /// </summary>
WebClient的超时问题及解决        /// <param name="userdata"></param>
WebClient的超时问题及解决        void _timer_TimeOver(object userdata)
WebClient的超时问题及解决        {
WebClient的超时问题及解决            this.CancelAsync();//取消下载
WebClient的超时问题及解决        }
WebClient的超时问题及解决    }
上一篇:python排序之二冒泡排序法


下一篇:HBase源代码分析