2016-08-20 39 views
1

ストリームに接続するすべてのクライアントに対して呼び出されるNamedPipeServerStreamBeginWaitForConnectionを使用しています。受け取ったコールバックは、共有スタティックListを操作します。 BeginWaitForConnectionが非同期で、複数のコールバックを並行して実行している可能性があるので、Listの同時実行性の問題が発生するかどうかは疑問です。私はそれを数回試してみましたが、うまくいきましたが、スレッドセーフであるかどうかはわかりません。代わりにConcurrentBagを使用するか、またはコードの周囲にlock(files) {...}を使用する必要がありますか?私は非同期のコンセプトやマルチスレッドに遭遇することはありませんが、並行性はかなり新しいものです。ここでの洞察は非常に高く評価されています。BeginWaitForConnectionとGeneric.Listの並行処理

PipeListenerここのエントリーポイントです。 BeginWaitForConnectionのためのコールバックで

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通話を開始します。これは、並行呼び出しが可能であり、共有状態を保護する必要があることを意味します。

廃止されたAPMではなく、awaitを使用することをお勧めします。また、usingでリソースを管理することを忘れないでください。

+0

共有状態をどのように保護する必要がありますか?そして、 'BeginWaitForConnection'はすでに非同期を抽象化していませんか?私が同期バージョンに切り替えて、自分自身で非同期を処理することを提案しているのでない限り?私は本当に続くわけではありません。これは単なるベアボーンのフィージビリティ・スタディであり、リソースにはそれほど関心はありませんが、良いキャッチです。 –

+0

2つの同時FetchFile呼び出しを持つことができます。そのため、FetchFileで触れられたすべてのリソースに安全な方法でアクセスする必要があります。ロックはここでうまくいくようです。 – usr

+0

同期バージョンの使用は、コードがより簡単になり、数十の同時接続を処理するように見えないため、さらに優れています。しかし、新しいタスク/スレッドで各接続を開始する必要があります。これにより、同時実行性の問題からユーザーを保護することはできません。 – usr