BeginWaitForConnection和Generic.列表并发性

本文关键字:并发 列表 Generic BeginWaitForConnection | 更新日期: 2023-09-27 18:03:17

我使用NamedPipeServerStreamBeginWaitForConnection,为连接到流的每个客户端调用。它接受的回调操作一个共享的静态List。我想知道BeginWaitForConnection是异步的,并且可能并行运行多个回调,这一事实是否会引发List的并发问题。我试过运行它几次,它似乎工作得很好,但我不确定它是否线程安全。我应该在我的FetchFile代码周围使用ConcurrentBag还是lock(files) {...} ?我对异步概念和多线程并不陌生,但并发性对我来说相当陌生,因此非常感谢您的任何见解。

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和Generic.列表并发性

BeginWaitForConnection的回调中,您已经开始了一个新的BeginWaitForConnection调用。这意味着并发调用是可能的,并且您需要保护共享状态。

注意,您可能应该使用await而不是过时的APM。另外,不要忘记使用using来管理您的资源。