C# 连接断开时超时。请帮帮我

C# 连接断开时超时。请帮帮我,c#,visual-studio,timer,download,timeout,C#,Visual Studio,Timer,Download,Timeout,我想在代码中输入一个超时。当文件被下载,而我没有上网时,它会持续60秒,如果连接没有恢复,就会发出一条消息 代码如下: string novoNome; novoNome = strlocal + "\\" + zipNome; using (WebClient wcDownload = new WebClient()) { try { if (!Directory.Exists(strlocal)) {

我想在代码中输入一个超时。当文件被下载,而我没有上网时,它会持续60秒,如果连接没有恢复,就会发出一条消息

代码如下:

string novoNome;
novoNome = strlocal + "\\" + zipNome;
using (WebClient wcDownload = new WebClient())
{ 
      try
        {
            if (!Directory.Exists(strlocal))
            {
                Directory.CreateDirectory(strlocal);
            }

            #region comunicação para download
            //string saida;
            // cria uma requisição do arquivo para download
            webRequest = (HttpWebRequest)WebRequest.Create(url);

            webRequest.ReadWriteTimeout = 60000;

            webResponse = (HttpWebResponse)webRequest.GetResponse();                    

            //Perguntar o tamanho do arquivo
            Int64 fileSize = webResponse.ContentLength;

            Uri uri = new Uri(url);

            // Abrindo arquivo para Download
            strResponse = wcDownload.OpenRead(uri);
            // Criando novo arquivo para salvar no HDD
            strLocal = new FileStream(novoNome, FileMode.Create, FileAccess.Write, FileShare.None);
            #endregion

            #region transferencia
            int bytesSize = 0;

            byte[] downBuffer = new byte[2048];                   

            try
            {
                while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0)
                {                           
                    strLocal.Write(downBuffer, 0, bytesSize);
                    //if(this.IsAccessible)
                    this.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize });
                    //wcDownload.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wcDownload_DownloadProgressChanged);                              
                }                        
            }
            catch (WebException ex)
            {                        
                MessageBox.Show("WEB ERROO:" + ex.Message);
            }
            catch (Exception e)
            {
                MessageBox.Show("Erro:" + e.Message);
            }
            #endregion
            }
        catch (WebException ex)
        {
            MessageBox.Show("WEB ERROO:" + ex.Message);
        }
        catch (Exception e)
        {
            MessageBox.Show("Erro:" + e.Message);
        }                            
        finally
        {
            strResponse.Close();
            strLocal.Close();
        }
    }
对不起,英语不好,我是巴西人

请帮忙


谢谢。

我相信您不需要为此定制超时处理实现。尝试将
webRequest.Timeout
属性设置为60000

要指定读取或写入操作超时前的等待时间,请使用属性

重要的

必须在GetRequestStream或之前设置Timeout属性 调用GetResponse方法。更改后的超时属性 调用GetRequestStream或GetResponse方法无效

编辑:

如果您正在寻找自定义超时处理,您仍然可以利用内置的
timeout
。因此,只需处理一个
WebException
,然后分析execption Status属性,它可以指出超时的原因。可能存在不同的状态代码,因此只需通过断开网络(模拟网络连接丢失)在本地计算机上模拟它,并查看状态,然后您可以添加一些代码来处理此情况,并启动自定义计时器(持续60秒)

我认为您需要处理以下状态:

  • 连接失败:无法在传输级别联系远程服务点
  • 超时:在请求的超时期间未收到响应
查看所有可用状态:


如果您需要更多详细信息或有什么不清楚的地方,请告诉我。

您是否考虑过异步读取,并在您的个人计时器读取60秒时切断连接?可能是您正在寻找的属性,或者是。无论是否是巴西人,请不要在您的帖子中写“请帮助我”和“请帮助”。人们会帮助(这是这个网站的目的),把你的问题清晰明了地给他们一个机会。作为一个小的风格点,如果你的方法如此庞大或复杂,以至于你试图将它与区域分开,你可能需要考虑重构一些块来分离函数……杰森,我已经试着用计时器数到60,但没用。还有别的主意吗?感谢此超时适用于所有下载。只有当internet连接断开时,我才需要一个启动计数。请参阅编辑部分以进行更新我设置了readwriteTimeout属性,处理了web异常并模拟了连接丢失,但什么也没有发生。我编辑了代码,请看一看。打印
异常。状态也可以与消息一起打印。那么,在断开网络连接时,您是否发现了任何错误?