设置超时,timeout,socket

来源:互联网 发布:缩小手机屏幕的软件 编辑:程序博客网 时间:2024/05/23 09:40
除了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; }        }


0 0
原创粉丝点击