0

I am attempting to push updates into a process via a named pipe, but in doing so my process loop now seams to stall on while ((line = sr.ReadLine()) != null). I'm a little mystified as to what might be wrong as this is my first foray into named pipes.

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);
            }
        }
    }
}

The solution to this problem was to make the RefreshThread() monitor a Queue<string> for data, and a separate thread to handle the pipe and push the strings received through the pipe into the Queue<string>

2 Answers 2

2

This is by design, PipeStream.Read() is a blocking call. You could use BeginRead() instead. This makes text less than a stellar format for data of course. Not a real problem, use PipeTransmissionMode.Message.

0

Does the client dispose of its named pipe connection? If the client never closes, your server will wait forever.

Not the answer you're looking for? Browse other questions tagged or ask your own question.