簡體   English   中英

NamedPipeClientStream.Write沒有返回

[英]NamedPipeClientStream.Write not returning

我正在嘗試開發兩個應用程序,它們在運行時通過命名管道相互通信,服務器應用程序創建兩個管道,一個用於向客戶端發送數據,另一個用於從中接收數據。

使用Task在另一個線程中處理寫入和讀取操作,在創建管道或連接它們時沒有問題。

當客戶端嘗試在管道中寫入數據時出現問題,一旦調用Write方法,執行就會停止。

//Server code

//NamedPipesManager is a class created by me.

            while (!TasksStopper.IsCancellationRequested)
            {
                if (!NamedPipesManager.IsConnected(OutPipe) & !NamedPipesManager.IsConnected(InPipe))
                {
                    OutPipe.WaitForConnection();
                    InPipe.WaitForConnection();
                }
                CanReceiveMessages.WaitOne(); //The server start reading data only when signaled by the client, so that there is always data to read.
                MessagesSemaphore.WaitOne(); //The methods of the class can be run only by one thread at a time, a Semaphore is used to regulate access.
                NamedPipesManager.ReceiveMessage(InPipe, out MessageReceived.MessageType, out MessageReceived.Response);
                if (MessageReceived.MessageType == NamedPipesManager.MESSAGES.CUSTOM_PROJECT_PATH_REQUEST)
                {
                    MessagesSemaphore.WaitOne();
                    NamedPipesManager.SendMessage(OutPipe, NamedPipesManager.MESSAGES.CUSTOM_PROJECT_PATH_REQUEST, Convert.ToString(CustomProjectsPath));
                }
                else if (MessageReceived.MessageType == NamedPipesManager.MESSAGES.DEFAULT_PROJECTS_PATH_REQUEST)
                {
                    MessagesSemaphore.WaitOne();
                    NamedPipesManager.SendMessage(OutPipe, NamedPipesManager.MESSAGES.DEFAULT_PROJECTS_PATH_REQUEST, DefaultProjectsPath);
                }
            }
            if (NamedPipesManager.IsConnected(OutPipe))
            {
                MessagesSemaphore.WaitOne();
                NamedPipesManager.SendMessage(OutPipe, NamedPipesManager.MESSAGES.DISCONNECT, null);
                OutPipe.WaitForPipeDrain();
            }

//Client code

            NamedPipeClientStream HubInPipe = null;
            NamedPipeClientStream HubOutPipe = null;
            while (!TasksStopper.IsCancellationRequested)
            {
                HubInPipe = NamedPipesManager.ConnectToNamedPipe(null, "ProjectExchangeAppOutPipe", NamedPipesManager.PIPE_DIRECTION.IN);
                HubInPipe.ReadMode = PipeTransmissionMode.Message;
                HubOutPipe = NamedPipesManager.ConnectToNamedPipe(null, "ProjectExchangeAppInPipe", NamedPipesManager.PIPE_DIRECTION.OUT);
                HubOutPipe.ReadMode = PipeTransmissionMode.Message;
                PipesConnectedEvent.Set();
                SendMessageEvent.WaitOne();
                MessagesSemaphore.WaitOne();
                NamedPipesManager.SendMessage(HubOutPipe, MessageType, MessageToSend);
                HubWaitHandle.Set();
                MessagesSemaphore.WaitOne();
                NamedPipesManager.ReceiveMessage(HubInPipe, out ReceivedMessage.MessageType, out ReceivedMessage.Response);
                if (ReceivedMessage.MessageType == NamedPipesManager.MESSAGES.CUSTOM_PROJECT_PATH_REQUEST || ReceivedMessage.MessageType == NamedPipesManager.MESSAGES.DEFAULT_PROJECTS_PATH_REQUEST)
                {
                    ReceivedMessages.Add(ReceivedMessage);
                    MessageReceivedEvent.Set();
                }
                else if (ReceivedMessage.MessageType == NamedPipesManager.MESSAGES.SETTINGS_PROFILE_CHANGED)
                {
                    DialogResult result = MessageBox.Show("...", "Avviso", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    if (result == DialogResult.Yes)
                    {
                        ProfileName = ReceivedMessage.Response;
                    }
                }
                else if (ReceivedMessage.MessageType == NamedPipesManager.MESSAGES.DISCONNECT)
                {
                    NamedPipesManager.ClosePipe(HubInPipe);
                    NamedPipesManager.ClosePipe(HubOutPipe);
                }
            }
            if (NamedPipesManager.IsConnected(HubInPipe) & NamedPipesManager.IsConnected(HubOutPipe))
            {
                NamedPipesManager.ClosePipe(HubInPipe);
                NamedPipesManager.ClosePipe(HubOutPipe);
            }
            else if (NamedPipesManager.IsConnected(HubInPipe) & !NamedPipesManager.IsConnected(HubOutPipe))
            {
                NamedPipesManager.ClosePipe(HubInPipe);
            }
            else if (!NamedPipesManager.IsConnected(HubInPipe) & NamedPipesManager.IsConnected(HubOutPipe))
            {
                NamedPipesManager.ClosePipe(HubOutPipe);
            }

//SendMessage method of NamedPipesManager class.

            if (Message != null)
            {
                byte[] Buffer = Encoding.Default.GetBytes(MessageType.ToString("D") + " " + Message);
                Pipe.Write(Buffer, 0, Buffer.Length); //L'esecuzione si blocca qui.
            }
            else
            {
                byte[] Buffer = Encoding.Default.GetBytes(MessageType.ToString("D"));
                Pipe.Write(Buffer, 0, Buffer.Length); //L'esecuzione si blocca qui.
            }
            Semaphore.Release();

//ReceiveMessage method of NamedPipesManager class

            MessageType = MESSAGES.NONE;
            Message = null;
            System.Diagnostics.Debugger.Break();
            StringBuilder sb = new StringBuilder();
            byte[] Buffer = new byte[10];
            string Chunk = string.Empty;
            while (Pipe.IsConnected)
            {
                int BytesRead = Pipe.Read(Buffer, 0, Buffer.Length);
                do
                {
                    Chunk = Encoding.Default.GetString(Buffer);
                    sb.Append(Chunk);
                    Buffer = new byte[10];
                }
                while (!Pipe.IsMessageComplete);
                string MessageReceived = sb.ToString();
                MessageType = (MESSAGES)Convert.ToInt32(MessageReceived[0].ToString());
                if (MessageReceived.Length > 1)
                {
                    Message = MessageReceived.Substring(3);
                }
            }
            Semaphore.Release();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM