0

ストリーム オブジェクトで排他ロック * を取得することは可能ですか? 特に: 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もう使用できないことを意味することに今気づきました。しかし、それは私には問題ありません。

4

1 に答える 1

0

@Hans が指摘したように、この特定の状況では、デコレータ クラスNetworkStream 内に新しいインスタンスを作成する方が適切です。デコレータのインスタンスを作成して、既存の のインスタンスをラップするのとは対照的ですNetworkStream

元の質問が残っていますが、これを解決済みとしてマークします。

于 2013-07-15T00:58:46.553 に答える