为什么我得到异常:对象处置异常

本文关键字:异常 对象 为什么 | 更新日期: 2023-09-27 18:33:56

这是代码:

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);

如果我没有长时间使用流阅读器和关闭,它工作正常,但是一旦我添加了流阅读器,我就会得到异常。

无法访问已释放的对象。

对象名称:"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);

为什么我得到异常:对象处置异常

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

当您关闭readStream

readStream.Close();

StreamReader.Close 方法关闭 StreamReader 对象和基础流,并释放与读取器关联的任何系统资源。Close的此实现调用传递真值的Dispose方法。

在 中设置的基础responseStream

StreamReader readStream = new StreamReader(responseStream, ...
关闭

并关闭流调用处置方法,它被释放。 之后,您可以访问responseStream和繁荣! ObjectDisposedException

StreamReader关闭时,Stream被关闭并被处置。有关详细信息,请查看 StreamReader Close 方法上的 MSDN 页。

也就是说,StreamReader的关闭方法

关闭 StreamReader 对象和基础流,并释放与读取器关联的任何系统资源。

随之而来的是:

Close的此实现调用传递真值的Dispose方法。

你使用..

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

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

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

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