除了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; }
}