2016-08-20 61 views
1

我使用NamedPipeServerStreamBeginWaitForConnection,每連接到流的客戶端都會調用NamedPipeServerStreamBeginWaitForConnection。所需的回調操作共享靜態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(); 
} 

回答

0

在回調BeginWaitForConnection你已經開始新的BeginWaitForConnection電話。這意味着併發調用是可能的,您需要保護共享狀態。

請注意,您可能應該使用await而不是過時的APM。另外不要忘記用using來管理您的資源。

+0

那麼我應該如何保護共享狀態呢?而不是'BeginWaitForConnection'已經抽象了異步?除非你建議我切換到同步版本並自己處理異步?我並不真正關注。這只是一個現在的準系統可行性研究,所以不要太在意資源,但是很好的捕獲。 –

+0

您可以有兩個併發的FetchFile調用,因此必須以安全的方式訪問FetchFile觸及的任何資源。鎖在這裏似乎很好。 – usr

+0

使用同步版本甚至更好,因爲代碼變得更簡單,並且看起來您不會處理幾十個併發連接。但是您需要在新的任務/線程上啓動每個連接,這樣不會使您免受併發問題的困擾。 – usr