`

WebClient的超时问题及解决

阅读更多

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

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

      

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->        protected override WebRequest GetWebRequest(Uri address)
        
{
            HttpWebRequest request 
= (HttpWebRequest)base.GetWebRequest(address);
            request.Timeout 
= 1000 * Timeout;
            request.ReadWriteTimeout 
= 1000 * Timeout;
            
return request;
        }

 

2.WebClient在异步下载

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

      

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    public class Calculagraph
    
{
        
/**//// <summary>
        
/// 时间到事件
        
/// </summary>

        public event TimeoutCaller TimeOver;

        
/**//// <summary>
        
/// 开始时间
        
/// </summary>

        private DateTime _startTime;
        
private TimeSpan _timeout = new TimeSpan(0010);
        
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(00, 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);

 

      

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->    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>
http://www.cnblo
分享到:
评论

相关推荐

    C#用POST方式发送数据大小不受限制的方法

    本文将详细介绍如何在C#中使用POST方式发送数据,并提供几种有效的方法来解决数据传输大小受限的问题。 #### 一、C# POST方式发送数据的基本介绍 在C#中,通常有以下两种主要的方式可以实现POST请求: 1. **使用...

    httpDownload

    `HttpDownload`就是为了解决这些问题而设计的。 首先,`HttpDownload`实现了下载超时的功能。在默认情况下,`WebClient`类没有内置的超时机制,这可能导致程序在长时间无响应的下载中挂起。通过封装`WebClient`,`...

    Titanium-WebClient:Appcelerator Titanium Web服务客户端

    Appcelerator Titanium拥有活跃的开发者社区,提供了丰富的教程、示例代码和问答资源,有助于开发者解决在使用Titanium-WebClient过程中遇到的问题。 10. **扩展性** 鉴于JavaScript的开放性,开发者可以通过编写...

    C#远程获取网页内容,多多学习了

    通过以上知识点的学习,我们可以了解到在C#中使用`WebClient`类远程获取网页内容的基本方法,包括设置网络凭据、处理异常、解决编码问题以及实现定时任务。这些知识对于开发需要与互联网交互的应用程序非常有用。...

    httpclient4.3 封装工具类

    这个封裝工具类是对HttpClient 4.3进行的二次开发,旨在简化HTTP请求的处理,解决一些常见的问题,如代理设置、多线程并发请求、SSL安全连接以及GET和POST请求的通用实现。 1. **代理问题**:在进行网络请求时,...

    Silverlight同步通信

    为了解决同步通信的限制,可以使用`WebClient.DownloadStringAsync()`或`HttpWebRequest.BeginGetResponse()`进行异步通信。异步通信允许UI线程在等待服务器响应的同时继续处理其他任务,确保用户界面的流畅性。 ##...

    Webbrowser调用dll,简单方便获取request response header等资源的例子,实现了HttpWebResquest等实现的功能

    老外写的Webbrowser调用dll,简单方便获取request header,response header等各种网络资源的例子,实现了原来只有WebClient,WebRequest和HttpWebResquest才能实现的功能。 需要dll的完整源代码见我上传的另外一个资源...

    C#/.NET HttpHelper源码,基于苏飞开发助手二次开发,修复HTTPS连接相关问题

    这个特定的"C#/.NET HttpHelper"源码是针对苏飞开发助手的二次开发版本,旨在优化和增强HTTP请求处理,特别是解决了HTTPS连接的相关问题。在本文中,我们将深入探讨HttpHelper的用途、功能以及它如何解决HTTPS连接...

    htmlunit2.9

    保持版本更新有助于利用最新的特性,提高测试效率,并解决可能出现的新问题。 总的来说,HTMLUnit 2.9提供了一种强大的工具,使得开发者能够对Web应用进行深入的测试和数据抓取,而无需依赖于真实的浏览器环境。...

    根据url下载文件

    另外,可能还需要处理网络错误和超时,以确保可靠性和用户体验。 对于更复杂的下载需求,可以使用`System.Net.Http.HttpClient`类,它提供了更多的控制和灵活性。例如: ```csharp using System.IO; using System...

    htmlunit-2.26-bin

    同时,合理设置`WebClient`的配置,如超时时间、重试策略等,也能提升性能。 8. **与其他库的集成**:HTMLUnit可以与JUnit、TestNG等测试框架结合,实现自动化的Web应用程序测试。同时,也可以配合其他网页抓取工具...

    C#上传支持2G文件上传,多文件上传!

    "支持2G文件上传"意味着源代码解决了大文件上传的问题,通常这涉及到流处理和断点续传技术,以确保大型文件可以分块传输并正确拼接。"多文件上传"则意味着同时处理多个文件的上传,这可能涉及到多线程或者异步编程,...

    C#实现HTML页面转jpg图片格式

    解决办法包括等待所有资源加载完成、设置合适的超时机制或利用JavaScript执行来确保页面完全渲染。 5. **保存为jpg**:最后,将截取的图像数据保存为jpg格式,可以使用`System.Drawing.Imaging`命名空间中的`Image`...

    C#某网址不能连接时重启电脑源码

    在尝试连接网站时,可能会遇到网络异常或超时等问题。为了确保程序的健壮性,我们需要捕获这些异常,例如`WebException`。如果捕获到异常,说明连接失败,可以触发重启计算机的逻辑。 4. **权限管理**: 在...

    文件下载实例(包含进度条)

    4. 添加错误处理机制,如超时、网络中断等,确保在出现问题时能够优雅地恢复或通知用户。 5. 设计合适的用户界面,包括开始、暂停、取消下载的按钮,以及清晰的进度指示。 通过这样的实现,用户不仅能知道文件是否...

    C# 通过网页获取外网 ip

    在提供的`.sln`和`.suo`文件中,`.sln`是解决方案文件,包含了项目的配置信息和所有相关的项目引用。`.suo`文件是用户选项文件,存储了用户特定的设置,如窗口位置、调试器设置等。这些文件配合项目源代码文件,可以...

    c#网络编程 全面介绍了各种C#网络类和方法

    通过学习,读者不仅能理解C#网络编程的原理,还能提升解决实际问题的能力。例如,如何构建一个简单的聊天应用、实现文件上传下载、进行HTTP请求等。 总的来说,《C#网络编程》是C#程序员提升网络编程技能的必备参考...

    java 大文件分片上传

    由于单个文件可能达到GB甚至TB的级别,一次性上传整个文件可能会导致网络拥塞、超时或者内存溢出等问题。因此,大文件分片上传成为了解决这些问题的有效策略。本文将详细介绍如何使用Java实现大文件的分片上传。 大...

    httpunit-1.7相关所有jar文件

    5. **文档更新**:包含的说明文档应该详细介绍了如何使用新特性,以及如何解决常见问题。 **示例代码** 下面是一个简单的HTTPUnit使用示例,展示了如何发送GET请求并获取响应内容: ```java import org.apache....

    C#164链接网页程序 源代码

    2. **WebClient类**:虽然HttpClient是更现代的选择,但WebClient在早期版本的.NET中广泛使用,同样支持下载和上传数据。开发者可能在旧项目中使用这个类。 3. **HTML解析**:为了提取或操作网页内容,开发者可能...

Global site tag (gtag.js) - Google Analytics