/// <summary> /// 线程池验证超时的回调函数 /// </summary> /// <param name="ir">异步操作的对象</param> private void VaildateTimeOut(object obj) { OperTimeOut tempObj = obj as OperTimeOut; if (tempObj != null) { while (!tempObj.IsSuccessful) { Thread.Sleep(100); if ((DateTime.Now - tempObj.StartTime).TotalMilliseconds > tempObj.DelayTime) { if (!tempObj.IsSuccessful) { //如果检测超时直接关闭释放 tempObj.WorkOPc.Disconnect(); } break; } } } }
/// <summary> /// 创建连接Opc /// </summary> /// <param name="OpcHostName">服务器的主机名</param> /// <param name="OpcHostIP">服务器的ip</param> /// <param name="timeOut">超时时间</param> /// <returns>自定义返回集合</returns> public Result <OPCServer> CreateConnection(string OpcHostName, string OpcHostIP, int timeOut) { OPCServer opc = null; Result <OPCServer> result = new Result <OPCServer>(); ManualResetEvent connectDone = new ManualResetEvent(false); StateObject state = new StateObject(); try { opc = new OPCServer(); } catch (Exception ex) { result.IsSuccess = false; result.Message = ex.Message + "初始化Opc服务器异常!"; return(result); } OperTimeOut tempTimeOut = new OperTimeOut() { WorkOPc = opc, DelayTime = timeOut, StartTime = DateTime.Now, }; //开启线程验证连接是否超时 ThreadPool.QueueUserWorkItem(new WaitCallback(VaildateTimeOut), tempTimeOut); try { state.WorkOpc = opc; state.WaitDone = connectDone; state.Ip = OpcHostIP; state.Name = OpcHostName; ThreadPool.QueueUserWorkItem(new WaitCallback(ThradConnecedOpc), state); } catch (Exception ex) { tempTimeOut.IsSuccessful = true; opc.Disconnect(); connectDone.Close(); result.Message = ex.Message; return(result); } connectDone.WaitOne(); connectDone.Close(); tempTimeOut.IsSuccessful = true; //如果开启线程发生了异常 if (state.IsError) { result.Message = state.ErrerMsg; result.IsSuccess = false; if (opc != null) { opc.Disconnect(); } } if (state.OpcStatus) { result.Content = opc; result.IsSuccess = true; state.Clear(); state = null; } return(result); }