我使用NamedPipeServerStream
和BeginWaitForConnection
,每連接到流的客戶端都會調用NamedPipeServerStream
和BeginWaitForConnection
。所需的回調操作共享靜態List
。 我想知道如果BeginWaitForConnection
是異步的,並且可能並行運行多個回調將引起List
的併發問題。我嘗試了幾次運行它,它似乎工作正常,但我不確定它是否線程安全。我應該使用ConcurrentBag
代替,還是使用lock(files) {...}
圍繞我的FetchFile
代碼?我對異步概念和多線程並不陌生,但併發性對我來說是相當新的,所以對此的任何洞察都非常感謝。BeginWaitForConnection和Generic.List併發性
PipeListener
是這裏的切入點。
static List<string> files = new List<string>();
static void PipeListener()
{
NamedPipeServerStream server = new NamedPipeServerStream("MyPipe", PipeDirection.In, -1,
PipeTransmissionMode.Byte, PipeOptions.Asynchronous);
server.BeginWaitForConnection(FetchFile, server);
}
static void FetchFile(IAsyncResult ar)
{
PipeListener();
NamedPipeServerStream server = ar.AsyncState as NamedPipeServerStream;
server.EndWaitForConnection(ar);
StreamReader reader = new StreamReader(server);
while (!reader.EndOfStream)
files.Add(reader.ReadLine());
server.Dispose();
}
那麼我應該如何保護共享狀態呢?而不是'BeginWaitForConnection'已經抽象了異步?除非你建議我切換到同步版本並自己處理異步?我並不真正關注。這只是一個現在的準系統可行性研究,所以不要太在意資源,但是很好的捕獲。 –
您可以有兩個併發的FetchFile調用,因此必須以安全的方式訪問FetchFile觸及的任何資源。鎖在這裏似乎很好。 – usr
使用同步版本甚至更好,因爲代碼變得更簡單,並且看起來您不會處理幾十個併發連接。但是您需要在新的任務/線程上啓動每個連接,這樣不會使您免受併發問題的困擾。 – usr