设置超时,timeout,socket

除了C#某些自带的timeout设置以外,有时也需要对某个请求设置超时时间(比如soket)。
例子如下:
       方法介绍:需判断某个值是否已经存在(soket访问其他服务),等待放回结果,但若时间过长,则无需等待了。
	// 判断CRS订单是否重复
        public bool IsDuplicate(string crsresvID)
        {
            string result = string.Empty;
            RefObject refobject = new RefObject();
            refobject.flag = true;
            try
            {
                //VerifyCRSResvIDTimeOut参数表示调用callback之前的时间延迟量
                //System.Threading.Timeout.Infinite表示无限长等待时间,以保证该callback只执行一次
                System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(SetFlag), refobject, VerifyCRSResvIDTimeOut,System.Threading.Timeout.Infinite);
                Thread thread = new Thread(() =>
                {
                    //创建终结点IPEndPoint
                    IPAddress ip = IPAddress.Parse(VerifyCRSResvIDServer);
                    IPEndPoint ipe = new IPEndPoint(ip, VerifyCRSResvIDPort);<pre class="csharp" name="code">

                    //创建Socket并连接到服务器
                  Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    socket.Connect(ipe); //连接到服务器

                    //向服务器发送信息
                    string sendStr = crsresvID;
                    byte[] sendBytes = Encoding.UTF8.GetBytes(sendStr);
                    socket.Send(sendBytes, sendBytes.Length, 0);

                    //接受从服务器返回的信息
                    byte[] recvBytes = new byte[1024];
                    int bytes = socket.Receive(recvBytes, recvBytes.Length, 0);
                   string recvStr = Encoding.UTF8.GetString(recvBytes, 0, bytes);//服务端返回数据:a,True b,False
                    socket.Close();
                    result = recvStr;
                });
                thread.Start();
                while (true)
                {
                    if (refobject.flag == false)
                    {
                        return false;
                    }
                    if (!string.IsNullOrWhiteSpace(result))
                    {
                        break;
                    }
                }
                return result == "True";
            }
            catch (Exception e)
            {
                Logger.Instance.WriteLog(string.Format("判断CRS订单是否重复异常!{0}\r\n{1}", e.Message, e.StackTrace));
                //若出现异常,则返回不重复,因为除节假日外,重复的几率很小
                return false;
            }
        }
	public void SetFlag(object o)
        {
            RefObject refObject = new RefObject();
            refObject = o as RefObject;
            refObject.flag = false;
        }
        public class RefObject
        {
            public bool flag { get; set; }
        }
 
 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值