ストリームに接続するすべてのクライアントに対して呼び出されるNamedPipeServerStream
とBeginWaitForConnection
を使用しています。受け取ったコールバックは、共有スタティック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();
}
共有状態をどのように保護する必要がありますか?そして、 'BeginWaitForConnection'はすでに非同期を抽象化していませんか?私が同期バージョンに切り替えて、自分自身で非同期を処理することを提案しているのでない限り?私は本当に続くわけではありません。これは単なるベアボーンのフィージビリティ・スタディであり、リソースにはそれほど関心はありませんが、良いキャッチです。 –
2つの同時FetchFile呼び出しを持つことができます。そのため、FetchFileで触れられたすべてのリソースに安全な方法でアクセスする必要があります。ロックはここでうまくいくようです。 – usr
同期バージョンの使用は、コードがより簡単になり、数十の同時接続を処理するように見えないため、さらに優れています。しかし、新しいタスク/スレッドで各接続を開始する必要があります。これにより、同時実行性の問題からユーザーを保護することはできません。 – usr