命名管道停止线程?

时间:2010-05-13 15:18:36

标签: c# named-pipes

我试图通过命名管道将更新推送到进程中,但是这样做,我的进程循环现在接缝停在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>

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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