BeginWaitForConnection和Generic.List并发

时间:2016-08-20 10:23:50

标签: c# asynchronous concurrency

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

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();
}

1 个答案:

答案 0 :(得分:0)

BeginWaitForConnection的回调中,您已开始新的BeginWaitForConnection来电。这意味着可以进行并发调用,并且需要保护共享状态。

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