【发布时间】:2016-08-20 20:25:34
【问题描述】:
我正在使用NamedPipeServerStream 和BeginWaitForConnection,每个连接到流的客户端都会调用它们。它采用的回调操作共享静态List。
我想知道BeginWaitForConnection 是异步的并且可能并行运行多个回调这一事实是否会引发List 的并发问题。我已经尝试运行它几次,它似乎工作正常,但我不确定它是否是线程安全的。我应该改用ConcurrentBag,还是在FetchFile 代码周围使用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();
}
【问题讨论】:
标签: c# asynchronous concurrency