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