BeginWaitForConnection和Generic.列表并发性
本文关键字:并发 列表 Generic BeginWaitForConnection | 更新日期: 2023-09-27 18:03:17
我使用NamedPipeServerStream
和BeginWaitForConnection
,为连接到流的每个客户端调用。它接受的回调操作一个共享的静态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
的回调中,您已经开始了一个新的BeginWaitForConnection
调用。这意味着并发调用是可能的,并且您需要保护共享状态。
注意,您可能应该使用await
而不是过时的APM。另外,不要忘记使用using
来管理您的资源。