【问题标题】:Timeout when connection is gone. HELP ME PLEASE [closed]连接消失时超时。请帮帮我[关闭]
【发布时间】:2012-03-28 19:09:43
【问题描述】:

我想在我的代码中设置一个超时时间。当文件正在下载并且我没有互联网时,它会计数为 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();
        }
    }

抱歉英语不好,我是巴西人。

请帮忙!!

谢谢。

【问题讨论】:

  • 您是否考虑过异步读取,并在您的个人计时器读取 60 秒时切断该连接?
  • 可能WebRequest.Timeout 是您要查找的属性或HttpWebRequest.ReadWriteTimeout
  • 无论是不是巴西人,请不要在您的帖子中写“HELP ME PLEASE”和“PLEASE HELP”。人们会提供帮助(这就是本网站的用途),只需清晰简洁地发布您的问题,并给他们一个机会。
  • 作为一个小风格点,如果您的方法太大或太复杂以至于您试图将其与区域分离,您可能需要考虑重构一些块以分离功能......
  • Jason,我已经尝试使用计时器计数到 60,但没有用。另一个想法?谢谢

标签: c# visual-studio timer download timeout


【解决方案1】:

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

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

重要

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

编辑:

如果您正在寻找自定义超时处理,您仍然可以利用内置的Timeout。因此,只需处理WebException,然后分析异常状态属性,该属性可以指示导致超时的原因。可能有不同的状态代码,因此只需通过断开网络在本地计算机上模拟它(模拟网络连接丢失)并查看状态是什么,然后您可以添加一些代码来处理这种情况并启动自定义计时器 60 秒)。

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

  • ConnectFailure:无法在传输级别联系远程服务点。
  • 超时:在请求超时期间未收到任何响应。

查看所有可用状态:WebExceptionStatus Enumeration

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

【讨论】:

  • 这个超时是针对所有下载的。只有当互联网连接消失时,我才需要一个开始计数。
  • 查看编辑部分进行更新
  • 我确实设置了 readwriteTimeout 属性,处理了 Web 异常并模拟了连接丢失但什么也没发生。
  • 我编辑了代码,请看一下。
  • 打印exception.Status 和消息也是有意义的。那么在断开网络连接时,您是否发现任何错误?
猜你喜欢
  • 2022-01-23
  • 2015-10-24
  • 2019-09-13
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多