函数调用出现的怪问题

hsn1982 2004-11-19 07:00:01
就是下面两个函数,在GetNumOfNewMail调用connect函数。
现在出现个奇怪问题,如果Connect中的'sr.Close() 不屏蔽,在GetNumOfNewMail中就会出错。如果屏蔽掉就不会出错。
我初学.net,搞不明白,两个函数中的不同变量难道可以互相影响?


Private Function Connect() As NetworkStream
Dim sender As New TcpClient("pop.163.com", 110)
Dim outbytes As Byte()
Dim input As String
Dim ns As NetworkStream = Nothing
Try
ns = sender.GetStream
Dim sr As New StreamReader(ns)
Console.WriteLine(sr.ReadLine)
input = "user hsn1982" + vbCrLf
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray())
ns.Write(outbytes, 0, outbytes.Length)
Console.WriteLine(sr.ReadLine)
input = "pass minhuacat" & vbCrLf
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray())
ns.Write(outbytes, 0, outbytes.Length)
Console.WriteLine(sr.ReadLine)
'sr.Close() '这行
Return ns
Catch ex As InvalidOperationException
Console.WriteLine("Connet pop server fail!")
Return ns
Catch ex As Exception
Console.WriteLine(ex.ToString)
End Try
End Function

Private Function GetNumOfNewMail() As Integer
Dim outbytes As Byte()
Dim input As String
Try
Dim ns As NetworkStream = Connect()
Dim sr1 As New StreamReader(ns) ''出错代码
input = "stat" + vbCrLf
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray())
ns.Write(outbytes, 0, outbytes.Length)
Dim resp As String = sr1.ReadLine()
Console.WriteLine(resp)
Dim tokens As String() = resp.Split(" ".ToCharArray)

input = "quit" + vbCrLf
outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray())
ns.Write(outbytes, 0, outbytes.Length)
Console.WriteLine(sr1.ReadLine())

sr1.Close()
ns.Close()
Return Integer.Parse(tokens(1))
Catch ex As Exception
Console.WriteLine(ex.ToString)
Return 0
End Try
End Function
错误信息:
System.ArgumentException: 流不可读。
at System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByte
OrderMarks, Int32 bufferSize)
at System.IO.StreamReader..ctor(Stream stream)
at VBStudioDemo.Module1.GetNumOfNewMail() in E:\net\VBStudioDemo\ModMain.vb:line 44
...全文
193 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jialiang 2004-11-20
  • 打赏
  • 举报
回复
学习
Jeff20040819 2004-11-20
  • 打赏
  • 举报
回复
学习 接分
canyqf 2004-11-19
  • 打赏
  • 举报
回复
system.dll!System.Net.Sockets.NetworkStream.System.IDisposable.Dispose()
system.dll!System.Net.Sockets.NetworkStream.Close() + 0x14 字节
mscorlib.dll!System.IO.StreamReader.Dispose(bool disposing = true) + 0x1d 字节
mscorlib.dll!System.IO.StreamReader.Close() + 0xf 字节

这是他的调用堆栈,至于为什么这样那我就不清楚了...

不过MSDN上关于TcpClient.GetStream有这样的说明:
注意 在完成数据的发送和接收之后,您无须关闭 NetworkStream。关闭 TcpClient 会将 NetworkStream 释放给垃圾回收器。

另外StreamReader的Dispose实际上只是在NetworkStream销毁时用到了GC,我想它本身并没有什么资源可以释放。

所以我想sr是否显式的Close掉是不是一定有必要?
hsn1982 2004-11-19
  • 打赏
  • 举报
回复
StreamReader.Close()会关闭掉NetworkStream ?
怎么NET是这样的吗?
canyqf 2004-11-19
  • 打赏
  • 举报
回复
StreamReader.Close()会将它的基础流关闭,
也就是ns被关闭了,你的Connect()返回的只是一个被关闭了的NetworkStream。
landlordh 2004-11-19
  • 打赏
  • 举报
回复
up

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧