Поток чтения / записи NamedPipeServerStream C#

#c# #thread-safety #named-pipes

#c# #безопасность потоков #именованные каналы

Вопрос:

Я пытаюсь разделить экземпляр NamedPipeServerStream между двумя потоками, читателем и писателем. Программа работает, но когда я пытаюсь создать два экземпляра объекта ServerProcess, поток записи начинает зависать. Где я ошибаюсь?

Любые предложения будут с благодарностью приняты.

Метод порождения заключается в следующем:

  public class ServerPrcoess
 {
    private static NamedPipeServerStream m_NamePipeHandle;
    public  static void StartPipe()
    {
        int i = 0;

        Thread[] OPCServerReader = new Thread();
        Thread[] OPCServerWriter = new Thread();

        m_NamePipeHandle = new NamedPipeServerStream(PIPENAME, PipeDirection.InOut, 254, PipeTransmissionMode.Message, PipeOptions.Asynchronous);

        m_NamePipeHandle.WaitForConnection();

        OPCServerReader = new Thread(PipeReaderThread);
        OPCServerReader.IsBackground = true;
        OPCServerReader.Start(i);

        Thread.Sleep(1000);

        OPCServerWriter = new Thread(PipeWriterThread);
        OPCServerWriter.IsBackground = true;
        OPCServerWriter.Start();
      }
 }
  

Поток чтения аналогичен приведенному ниже и создает двоичный объект чтения с использованием дескриптора канала :-

 private  static void PipeReaderThread(object ThreadNo)
{
     Console.WriteLine("Reader Thread Number: {0}", (int)ThreadNo);
     try
     {

         StreamOPCMessageReader oMsgReader = new StreamOPCMessageReader(m_NamePipeHandle);

            ...
  

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

 private static void PipeWriterThread(object _ThreadNo)
{         
     int ThreadNo  = Thread.CurrentThread.ManagedThreadId;
     try
     {               
        StreamOPCMessageWriter oMsgWriter = new StreamOPCMessageWriter(m_NamePipeHandle);
  

Ответ №1:

Вы не можете создать несколько экземпляров NamedPipeServerStream с одним и тем же именем (PIPENAME).

Комментарии:

1. Если вы инициализируете каждый экземпляр NamedPipeServerStream в своем собственном потоке, тогда я бы подумал, что это не проблема

2. попробуйте выполнить new Thread(() => {new NamedPipeServerStream("pipe"); Thread.Sleep(1000);}).Start(); дважды