2016-04-20 3 views
1

Im пытается установить именованное соединение между серверным программным обеспечением и клиентом.Именованные каналы Сервер выходит без предупреждения

Это мой код сервера:

class Program 
{ 
    private static NamedPipeServerStream server = new NamedPipeServerStream("p", PipeDirection.InOut); 
    static void Main(string[] args) 
    { 
     Action<NamedPipeServerStream> a = callBack; 
     a.BeginInvoke(server, ar => { }, null); 
    } 

    private static void callBack(NamedPipeServerStream pipe) 
    { 
     pipe.WaitForConnection(); 
     var line = ""; 
     while (line != "exit") 
     { 
      try 
      { 
       StreamReader reader = new StreamReader(pipe); 
       while (line != "exit") 
       { 
        line = reader.ReadLine(); 
        switch (line) 
        { 
         default: 
          foo(); 
          break; 
        } 
       } 
       break; 
      } 
      catch (IOException) 
      { 
       pipe.Disconnect(); 
       continue; 
      } 
     } 
    } 
} 

Но когда я пытаюсь запустить это приложение, он выходит сразу после старта.

Я использовал отладчик, чтобы добраться до линии WaitForConnection, а затем он выходит без ошибки или исключения. И ничего не работает, кроме сервера.

Он уходит, не получая обработанную часть. Я что-то пропустил?

ответ

1

Выполнение блокируется в WaitForConnection и не будет продолжаться до тех пор, пока объект NamedPipeClientStream не установит соединение с объектом NamedPipeServerStream.

Пожалуйста, смотрите здесь (пример должен помочь вам): https://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream(v=vs.110).aspx

EDIT: я понял проблему и первоначально думали, что вопрос должен был сделать с выполнением блокирующего от метода WaitForConnection. Код ниже - это дополнение к реальному quesiton, а также мое объяснение.

Проблема заключается в том, как вы вызываете свое действие. Когда вы вызываете BeginInvoke, он вызывается асинхронно, в потоке threadpool. Поэтому вам нужно проверить, закончилось ли действие или нет, основной поток продолжает работать и доходит до конца. Я обновил свой ответ о том, как вы можете сделать это очень легко

Надеюсь, этот код поможет вам понять, почему он существует! :)

 Action<NamedPipeServerStream> a = callBack; 
     var result = a.BeginInvoke(server,ar => { },null); 

     while (!result.IsCompleted) 
     { 

     } 
+0

Я знаю, что выполнение будет заблокировано нормально. Но в этом случае вся программа завершает работу. – Snickbrack

+0

@Snickbrack Ahh в порядке, приличия. Я думал, вы имели в виду, говоря: «И ничего не работает, кроме сервера», что он продолжал работать, но не пошел дальше кода. Я посмотрю поближе и вернусь к вам. –

+0

@Snickbrack Проблема заключается в том, как вы вызываете свое действие. Когда вы вызываете BeginInvoke, он вызывается асинхронно, в потоке threadpool. Поэтому вам нужно проверить, закончилось ли действие или нет, основной поток продолжает работать и доходит до конца. Я обновил свой ответ о том, как вы можете сделать это очень легко –