命名管道停止线程?

Posted

技术标签:

【中文标题】命名管道停止线程?【英文标题】:Named pipe stalls threads? 【发布时间】:2010-05-13 15:18:35 【问题描述】:

我正在尝试通过命名管道将更新推送到进程中,但这样做我的进程循环现在会在while ((line = sr.ReadLine()) != null) 上停止。由于这是我第一次涉足命名管道,我对可能出了什么问题感到有些困惑。

void RefreshThread()

    using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("processPipe", PipeDirection.In))
    
        pipeStream.WaitForConnection();

        using (StreamReader sr = new StreamReader(pipeStream))
        
            for (; ; )
            
                if (StopThread == true)
                
                    StopThread = false;
                    return;                 // exit loop and terminate the thread
                

                // push update for heartbeat
                int HeartbeatHandle = ItemDictionary["Info.Heartbeat"];
                int HeartbeatValue = (int)Config.Items[HeartbeatHandle].Value;
                Config.Items[HeartbeatHandle].Value = ++HeartbeatValue;
                SetItemValue(HeartbeatHandle, HeartbeatValue, (short)0xC0, DateTime.Now);

                string line = null;
                while ((line = sr.ReadLine()) != null)
                
                    // line is in the format: item, value, timestamp
                    string[] parts = line.Split(',');

                    // push update and store value in item cache
                    int handle = ItemDictionary[parts[0]];
                    object value = parts[1];
                    Config.Items[handle].Value = int.Parse(value);
                    DateTime timestamp = DateTime.FromBinary(long.Parse(parts[2]));
                    SetItemValue(handle, value, (short)0xC0, timestamp);
                

                Thread.Sleep(500);
            
        
    


解决这个问题的方法是让 RefreshThread() 监视一个 Queue<string> 的数据,以及一个单独的线程来处理管道并将通过管道接收到的字符串推送到 Queue<string>

【问题讨论】:

【参考方案1】:

这是设计使然,PipeStream.Read() 是一个阻塞调用。您可以改用 BeginRead()。当然,这使得文本不是一种出色的数据格式。不是真正的问题,使用 PipeTransmissionMode.Message。

【讨论】:

【参考方案2】:

客户端是否处理其命名管道连接?如果客户端永远不会关闭,您的服务器将永远等待。

【讨论】:

以上是关于命名管道停止线程?的主要内容,如果未能解决你的问题,请参考以下文章

LINUX FIFO 命名管道 (IPC) 在特定文件描述符处停止写入/读取消息

为啥线程在进程间通信期间会破坏命名管道?

Java中的命名管道和多线程

与命名管道和 WCF 服务的进程间通信:线程问题

从命名管道并发选择

为啥这个命名管道不打印发送的行?