NetworkStream上的独占锁定



是否可以在流对象上获得独占锁*?特别是: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

现在我有了一些基本的(不是双关语,对不起C#用户)方法,可以用来与我的FTP服务器对话,我需要开始担心当前的连接状态。我登录了吗?我们还在谈判选择吗?这个服务器会说UTF8吗?名单还在继续。

如果我在_networkStream上有一个独占锁,情况就不会那么糟糕了。但现在,任何引用底层流对象的人都可以做一些事情,稍后可能会破坏我的整个程序。见鬼,我甚至不能确保流对象在被传递到我的包装类之前没有被使用过。

有没有办法在流对象上获得某种排他锁?或者我完全偏离了轨道?

编辑

现在我正在看System.Threading.Monitor。我太笨了,不知道怎么用。

编辑

我刚刚意识到,这可能意味着我不能再使用StreamReaderStreamWriter了。但这对我来说很好。

正如@Hans所指出的:在这种特殊情况下,在my decorator类中创建NetworkStream的新实例更合适。与创建装饰器的实例来包装先前存在的NetworkStream实例相反。

尽管最初的问题仍然存在,但我将把它标记为已解决。

相关内容

  • 没有找到相关文章

最新更新