首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetworkStream上的独占锁

NetworkStream上的独占锁
EN

Stack Overflow用户
提问于 2013-07-13 04:43:01
回答 1查看 136关注 0票数 0

是否有可能获得流对象的独占锁*?特别是:System.Net.Sockets.NetworkStream

*:我所说的“锁定”,是指只要我仍然持有对我的流对象的引用,就可以阻止任何人对它进行读写。

我正在为我的FTP库编写流装饰器。它封装一个网络流,并添加各种特定于FTP的命令。看上去很像这样:

代码语言:javascript
复制
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了。但这对我来说没问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-15 00:58:46

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

即使原来的问题仍然存在,我还是要把这个问题标为已解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17627043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档