Я в замешательстве. У меня есть клиент-серверная структура именованного канала, и проблема в какой-то случайной точке, после некоторого времени работы она просто зависает на streamReader.ReadLine (); Он просто останавливается, и дальше не идет. Я сбит с толку, я совершенно не знаю, что происходит, и как на самом деле это отлаживать, почему и когда это происходит. Любые идеи?

На стороне клиента иногда делают:

   private void Connect()
    {
        stream = new NamedPipeClientStream(".", "MP9", PipeDirection.InOut);
        try
        {
            stream.Connect(120);
        }
        catch (Exception e)
        {
            run = false;
            return;
        }

        //Initialising Readers/Writers
        sr = new StreamReader(stream);
        sw = new StreamWriter(stream);
    }

private string SendMessage(string msg)
{
    Debug.WriteLine("Will listen for message " + msg);

    string msgFrom = "";
    if (run)
    {
        string toReturn = "";
        lock (locker)
        {

            sw.WriteLine(msg); //Writing command to the pipes
            stream.WaitForPipeDrain(); //Waiting for another process to read the command
            msgFrom = sr.ReadLine(); //Reading
        }
    }
    return msgFrom;
}

И у моего сервера есть поток, который прослушивает любые сообщения и отвечает, если это необходимо. И после X часов работы он просто остановится на ReadLine без ошибок или около того. Просто останавливается на линии и дальше не идет. Однако приложение все еще работает, оно не зависло, просто этот поток слушателя кажется зависшим ...

void Listen()
{
    try
    {
        stream.WaitForConnection();
        sw.AutoFlush = true;
        string messageTo = "";
        while (running) //Main loop of the thread
        {
            messageFrom = "";
            //HERE IT CAN JUST HANG AND NOT GO FURTHER....
            messageFrom = sr.ReadLine(); //Reading

            //populate message to with data, if is needed to respond

            sw.WriteLine(messageTo);
            stream.WaitForPipeDrain();
        }
    }
 }
2
PolosatiyVjih 26 Фев 2018 в 17:38

1 ответ

Лучший ответ

Кажется, это произойдет, если вы прочитаете все данные.

Если вы выполните «Peek ()» и проверьте значение выше 0, прежде чем читать, вы сможете это исправить.

stream.WaitForConnection();
    sw.AutoFlush = true;
    string messageTo = "";
    while (running) //Main loop of the thread
    {
        messageFrom = "";
        if(sr.Peek() > 0)
        {
           messageFrom = sr.ReadLine(); //Reading

          //populate message to with data, if is needed to respond

           sw.WriteLine(messageTo);
        }
        stream.WaitForPipeDrain();
0
Nick 1 Май 2018 в 01:54