繁体   English   中英

NamedPipeClientStream.Write没有返回

NamedPipeClientStream.Write not returning

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试开发两个应用程序,它们在运行时通过命名管道相互通信,服务器应用程序创建两个管道,一个用于向客户端发送数据,另一个用于从中接收数据。

使用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();
问题暂未有回复.您可以查看右边的相关问题.
1 NamedPipeClientStream.Write 块

我只是想了解 C# 中的管道。 我有一个简单的 LinqPad 脚本: 如果我运行上面的代码,我会得到以下输出: 所以对client.Write的第二次调用client.Write永远阻塞。 有人可以解释一下为什么第二次调用 write(在同一线程中)会导致管道永远阻塞? 谢谢 ...

2021-03-23 14:51:05 1 75   c#/ ipc
3 检查 NamedPipeClientStream 写入是否成功

基本上是标题...我想对天气NamedPipeServerStream对象成功收到一个值有相同的反馈。 这是起始代码: 我在每次读取时都从 NamedPipeServerStream 实现了一个小的回显消息。 我想我可以添加一些异步超时来检查 npc.ReadByte(); 确实以 200 毫秒 ...

4 NamedPipeClientStream AccessViolation

今天我遇到一个问题,其中NamedPipeClientStream的构造函数抛出了一个AV。 将其煮沸后尝试获得最小的可重复示例,我发现... 在VS2013 Update 4中创建一个新项目(控制台将这样做),针对.Net 3.5 更改main看起来像这样。 跑 ...

5 尝试从NamedPipeClientStream写入NamedPipeServerStream时如何修复“管道中断”错误

我有一个程序,该程序必须与从第一个调用的另一个程序通信。 我设法使用NamedPipes将所需的数据从第一个程序发送到第二个程序。 当第二个程序关闭时,我需要将一些数据发送回第一个程序。 我在第一个程序中设置了NamedPipeServerStream,从第二个程序的Closing事件中设 ...

6 异步使用NamedPipeServerStream和NamedPipeClientStream

我对服务器/客户端架构有以下要求: 编写异步工作的服务器/客户端。 通信需要是双工的,即两端的读写。 多个客户端可以在任何给定时间连接到服务器。 服务器/客户端应该等到它们可用并最终建立连接。 一旦客户端连接,它应该写入流。 然后服务器应该从流中 ...

7 NamedPipeClientStream 未连接

在我们的主应用程序中,我们有以下功能(在 VB.Net 中): NamedPipeServer 是用 C# 编写的,目前托管在控制台应用程序中: GetNewResults函数每三秒调用一次。 第一次调用此函数时,它可以正常工作。 但是第二次代码在Client.Connect阻塞。 服务 ...

8 NamedPipeClientStream 在 Connect 上抛出 UnauthorizedAccessException

在将“写入”管道连接到正在运行的服务时,其他人都遇到了同样的问题:UnauthorizedAccessException。 我尝试了所有解决方案,但没有任何方法可以使其成功连接。 该方案是在系统托盘中运行一个低完整性 C#/WPF 应用程序,它使用命名管道从 Windows 服务获取通知,并可以告 ...

9 从NamedPipeClientStream移位

我目前正在尝试编写有点同步的串行协议,该协议通过NamedPipeClientStream读取数据。 然后需要连续监视此数据的同步字符(十六进制22),同步字符可能在字节边界上,也可能不在字节边界上,并相应地移动数据以确保所接收的其他数据在帧中。 我已经原型化了几种方案,包括位数组和使用 ...

10 NamedPipeServerStream / NamedPipeClientStream包装器

我正在为NamedPipeServerStream / NamedPipeClientStream编写一个小包装器,它完全基于Event ,与使用AsyncCallbacks相反。 我公开了几乎所有可能的同步和异步方法(连接/等待连接,写入等),所以如果消费者想要,例如,启动服务器实例并在 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM