NetworkStream上的独占锁

时间:2013-07-13 04:43:02

标签: .net vb.net sockets ftp stream

是否可以在流对象上获得独占锁*?特别是: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了。但那对我没问题。

1 个答案:

答案 0 :(得分:0)

正如@Hans所指出的那样:在这种特殊情况下,在我的装饰器类中创建NetworkStream 的新实例更合适。而不是创建装饰器的实例来包装先前存在的NetworkStream实例。

即使最初的问题仍然存在,我也会将此标记为已解决。