是否可以在流对象上获得排他锁 *?特别是:System.Net.Sockets.NetworkStream
。
*:“锁定”是指阻止任何引用我的流对象的人读/写它,只要我仍然持有对它的引用。
我正在为我的 FTP 库编写流装饰器。它封装了一个网络流并添加了各种 FTP 特定的命令。它看起来很像这样:
Public Class FtpStream
Inherits Stream
Private ReadOnly _networkStream As NetworkStream
Private ReadOnly _streamReader As StreamReader
Private ReadOnly _streamWriter As StreamWriter
Friend Sub New(networkStream As NetworkStream)
If networkStream Is Nothing Then
Throw New ArgumentNullException("networkStream")
End If
_networkStream = networkStream
_streamReader = New StreamReader(_networkStream, Text.Encoding.UTF8)
_streamWriter = New StreamWriter(_networkStream, Text.Encoding.UTF8)
End Sub
#Region "IO.Stream"
' Most calls to overridable members are delegated to _networkStream (Omitted for brevity).
' Read/Write calls throw InvalidOperation; users are expected to call FTP-specific methods.
#End Region
#Region "FTP-specific"
Public Function NoOperation() As String
_streamWriter.WriteLine("NOOP")
_streamWriter.Flush()
Return _streamReader.ReadLine()
End Function
Public Function User(userName As String) As String
_streamWriter.WriteLine(String.Concat("USER ", userName))
_streamWriter.Flush()
Return _rea_streamReaderer.ReadLine()
End Function
Public Function Pass(password As String) As String
_streamWriter.WriteLine(String.Concat("PASS ", password))
_streamWriter.Flush()
Return _streamReader.ReadLine()
End Function
Public Function PrintWorkingDirectory() As String
_streamWriter.WriteLine("PWD")
_streamWriter.Flush()
Return _streamReader.ReadLine()
End Function
#End Region
End Class
现在我有了一些可以用来与 FTP 服务器通信的基本方法(不是双关语,对不起 C# 人),我需要开始担心当前的连接状态。我登录了吗?我们还在协商选择吗?这个服务器会说 UTF8 吗?名单还在继续。
如果我有一个排他锁,这不会那么糟糕_networkStream
。但是现在,任何引用了底层流对象的人都可以做一些事情,以后可能会破坏我的整个程序。哎呀,我什至无法确保在将流对象传递给我的包装类之前没有使用它。
有没有办法在流对象上获得某种排他锁?或者也许我完全偏离了轨道?
编辑
现在我在看System.Threading.Monitor
。我太愚蠢了,不知道如何使用它。
编辑
我刚刚意识到这可能意味着我不能使用StreamReader
或StreamWriter
不再使用。但这对我来说很好。