我使用NamedPipeServerStream
和BeginWaitForConnection
为每个连接到流的客户端调用。它所采用的回调操纵共享静态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();
}
答案 0 :(得分:0)
在BeginWaitForConnection
的回调中,您已开始新的BeginWaitForConnection
来电。这意味着可以进行并发调用,并且需要保护共享状态。
请注意,您可能应该使用await
而不是过时的APM。另外,请不要忘记使用using
管理您的资源。