为什么我得到异常:ObjectDisposedException?

时间:2014-12-10 22:33:27

标签: c# .net winforms ftp

这是代码:

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,那么关闭它可以正常工作,但是一旦我添加了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);

3 个答案:

答案 0 :(得分:3)

  

ObjectDisposedException:对已处置对象执行操作时引发的异常。

关闭readStream

readStream.Close();
  

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

中设置的基础responseStream
StreamReader readStream = new StreamReader(responseStream, ...

关闭并关闭流调用dispose方法并将其处理掉。之后,您访问responseStream并繁荣! ObjectDisposedException

答案 1 :(得分:1)

Stream关闭时,StreamReader会关闭并处理。有关详细信息,请查看StreamReader Close method上的MSDN页面。

即,StreamReader的关闭方法

  

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

同时:

  

Close的这个实现调用Dispose方法传递一个真值。

答案 2 :(得分:0)

你使用..

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

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

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

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