如何实现流读取超时 属性

how to implement stream readtimeout property

我正在修复一个错误:当失去网络连接时,应用程序将在下载过程中挂起 5 分钟。我需要做的是将挂起时间减少到 20 秒左右。

日志片段:

Severe  2016-01-27 , 11:03:14
    在 HttpsDownload.doDownloadByHttps(FileDownloadInfo fileInfo, downloadingDelegate downDelegate)
    Message: Init method:GET

Info    2016-01-27 , 11:08:29
    在 HttpsDownload.writeToFile(FileDownloadInfo fileInfo, Stream stream, downloadingDelegate downDelegate, Boolean Clear)
    Message: Exception while reading from the response stream
    Exception:
        Message: time out
        Type: System.Net.WebException
           在 System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   在 HttpsDownload.writeToFile(FileDownloadInfo fileInfo, Stream stream, downloadingDelegate downDelegate, Boolean Clear)

代码片段:

private void doDownloadByHttps(FileDownloadInfo fileInfo, downloadingDelegate downDelegate)
        {
                //code
                webResponse = (HttpWebResponse)webRequest.GetResponse();
                responseStream = webResponse.GetResponseStream();
                writeToFile(fileInfo, responseStream, downDelegate, bClear);
        }
private void writeToFile(FileDownloadInfo fileInfo, Stream stream, downloadingDelegate downDelegate, bool Clear)
        {
                int count = stream.Read(readBuffer, 0, BlockSize);
                while (count > 0) 
                {
                    //code
                    count = stream.Read(readBuffer, 0, BlockSize);
                }
        }

根据日志,我认为超时发生在 stream.Read。所以最简单的方法应该是 stream.ReadTimeout = 20000,但显然我不能设置 ReadTimeout 属性。 另一种可以想到的方法是写一个 class override ReadTimeout 像:

public class MyStream : Stream {
//code
public override int ReadTimeout { get; set; }
//code
}

但这不是首选。有没有更好的方法来修复这个错误?

需要在 webRequest 对象中设置超时,类型为 HttpWebRequest

看看这个:https://msdn.microsoft.com/en-US/library/system.net.httpwebrequest.readwritetimeout(v=vs.110).aspx