【问题标题】:Why i'm getting exception: ObjectDisposedException?为什么我得到异常:ObjectDisposedException?
【发布时间】:2014-12-10 22:33:26
【问题描述】:

这是代码:

FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader readStream = new StreamReader(responseStream, System.Text.Encoding.UTF8);
long filel = readStream.ReadToEnd().Length;
readStream.Close();
FileStream writeStream = new FileStream(ftpdirectories + "\\" + filenameonly, FileMode.Create);
string fnn = ftpdirectories + "\\" + filenameonly;
int Length = 2048;
Byte[] buffer = new Byte[Length];
int bytesRead = responseStream.Read(buffer, 0, Length);

异常上线:

int bytesRead = responseStream.Read(buffer, 0, Length);

如果我不使用 StreamReader long 和 Close 它可以正常工作,但是一旦我添加 StreamReader 我就会遇到异常。

无法访问已处置的对象。

对象名称:'System.Net.Sockets.NetworkStream'。

 System.ObjectDisposedException was caught
      HResult=-2146232798
      Message=Cannot access a disposed object.
    Object name: 'System.Net.Sockets.NetworkStream'.
      Source=System
      ObjectName=System.Net.Sockets.NetworkStream
      StackTrace:
           at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
           at System.Net.FtpDataStream.Read(Byte[] buffer, Int32 offset, Int32 size)
           at FTP_ProgressBar.FtpProgress.DownloadFtpContent(Object sender, String file, String filesdirectories, String fn) in c:\ftp_progressbar\FTP_ProgressBar\FtpProgress.cs:line 284
      InnerException:

第 284 行是:

int bytesRead = responseStream.Read(buffer, 0, Length);

【问题讨论】:

    标签: c# .net winforms ftp


    【解决方案1】:

    ObjectDisposedException:对已释放对象执行操作时抛出的异常。

    当你关闭readStream

    readStream.Close();
    

    StreamReader.Close Method 关闭 StreamReader 对象和底层流,并释放与读取器关联的所有系统资源。 Close 的此实现调用 Dispose 方法并传递一个真值。

    底层responseStream设置在

    StreamReader readStream = new StreamReader(responseStream, ...
    

    关闭并关闭流调用 dispose 方法,然后将其释放。之后您访问responseStream 并繁荣! ObjectDisposedException

    【讨论】:

    • 有什么办法吗?使用 StreamReader 读取文件大小而不处理流?我的 ftp 服务器不允许我使用 ContentLength,所以我尝试使用 StreamReader,StreamReader 确实获得了文件大小,但也进行了处理。
    • 你应该使用using并在你的using块内做你想做的事,这样之后资源就会自动处理msdn.microsoft.com/en-us/library/yh598w02.aspx
    • 您将遇到一个更大的问题,以获取您在整个流中阅读的总长度,但您似乎正在尝试为阅读制作进度条。如果您只是等待整个下载时间来确定您的进度条应该有多大,那么进度条的意义何在?
    • Scott 那么我应该以某种方式在 while 循环中进行读取并在那里报告它?
    【解决方案2】:

    Stream 被关闭并在 StreamReader 关闭时被释放。查看StreamReaderClose method 上的 MSDN 页面了解更多信息。

    也就是说,StreamReader 的 Close 方法

    关闭 StreamReader 对象和底层流,并释放与阅读器关联的所有系统资源。

    除此之外:

    此 Close 实现调用 Dispose 方法并传递一个真值。

    【讨论】:

      【解决方案3】:

      你正在使用..

      StreamReader readStream = new StreamReader(responseStream, System.Text.Encoding.UTF8);
      

      提供响应所需的编码如下。

      StreamReader readStream = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("Windows-1252"));
      

      这发生在德语字符中,如 ü、ö、ä 等。因此,UTF-8 可能在读取并关闭流时失败。因此,您需要针对 URL 或预期响应维护编码列表,并按上述方式传递它。

      【讨论】:

        猜你喜欢
        • 2018-06-22
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多