博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
命名管道 问题:信号灯超时问题
阅读量:5220 次
发布时间:2019-06-14

本文共 2470 字,大约阅读时间需要 8 分钟。

出错前服务端核心代码:

    private static NamedPipeServerStream _pipeServer = new NamedPipeServerStream("Pipe", PipeDirection.InOut, 1);     private void WorkerThread()        {            try            {                _pipeServer.WaitForConnection();                var ss = new StreamString(_pipeServer);                ss.WriteString("I am the one true server!");                var cmdText = ss.ReadString();                if (cmdText == "Are you Free?")                {                    var result = _engine.IsHome(_engine.State);                    ss.WriteString(result.ToString());                }            }            catch (ThreadAbortException)            {                return;            }            catch (Exception ex)            {                return;            }        }

客户端核心代码:

using (var pipeClient = new NamedPipeClientStream(".", "Pipe", PipeDirection.InOut,               PipeOptions.None, TokenImpersonationLevel.Impersonation))            {                    pipeClient.Connect(500);                if (pipeClient.IsConnected)                {                    var ss = new StreamString(pipeClient);                    if (ss.ReadString() == "I am the one true server!")                    {                        ss.WriteString("Are you Free?");                        bool.TryParse(ss.ReadString(), out _isFree);                     }          }
        }

通信逻辑:客户端一直去判断服务端是否空闲。

可以看出来:客户端一直是起一个新的实例去通信服务端。服务端确实一个静态的唯一的实例

出现问题。客户端只能去通信一次,再一次通信报错,出现信号灯超时问题。

原因:服务端实例返回客户端信息后,通道关闭掉了。不再会等待连接。

解决办法:1.服务端每次循环启动新的管道去监听。

     2.唯一实例的话。循环关闭连接再重新打开去监听。如下.

      

  public void Stop()        {            _running = false;            _pipeServer.Disconnect();        }        private void WorkerThread()        {            try            {                _pipeServer.WaitForConnection();                var ss = new StreamString(_pipeServer);                ss.WriteString("I am the one true server!");                var cmdText = ss.ReadString();                if (cmdText == "Are you Free?")                {                    var result = _engine.IsHome(_engine.State);                    ss.WriteString(result.ToString());                }                Stop();                WorkerThread();            }            catch (ThreadAbortException)            {                return;            }            catch (Exception ex)            {                return;            }        }

 

转载于:https://www.cnblogs.com/TeemoHQ/p/6020094.html

你可能感兴趣的文章
Codeforces Round #361 (Div. 2)
查看>>
细说WebSocket - Node篇
查看>>
[洛谷1485] 火枪打怪
查看>>
Extjs控件之 grid打印功能
查看>>
枚举类型(不常用)递归
查看>>
minggw 安装
查看>>
Jquery操作cookie,实现简单的记住用户名的操作
查看>>
[BZOJ1196][HNOI2006]公路修建问题 二分答案+最小生成树
查看>>
【原创】大数据基础之Zookeeper(4)应用场景
查看>>
静态变量数组实现LRU算法
查看>>
在SQL中怎么把一列字符串拆分为多列
查看>>
中文系统 上传file的input显示英文
查看>>
比callback更简洁的链式执行promise
查看>>
android permission
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
事务备份还原分离附加
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
[BSGS][哈希]luogu P3846 可爱的质数
查看>>
Python 第四十五章 MySQL 内容回顾
查看>>
iostat参数说明
查看>>