C#线程执行超时处理与并发线程数控制实例
本文实例讲述了C#线程执行超时处理与并发线程数控制的方法。分享给大家供大家参考。具体实现方法如下:
特别说明:
1、为了测试方便,这里对存储过程的执行是模拟的
2、这里限制了并发执行存储过程的最大个数,但并没有对并发线程数进行控制,与文章标题略有不符,但程序稍做改动即可控制并发线程数
代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Data.OracleClient; usingSystem.Diagnostics; usingSystem.IO; usingSystem.ServiceProcess; usingSystem.Text; usingSystem.Threading; usingSystem.Timers; usingSystem.Xml; usingDBUtil; usingFQDService.Utils;
namespaceFQDService { ///<summary> ///FQD服务 ///</summary> partialclassFQDService:ServiceBase { #region变量 ///<summary> ///存储过程配置文档 ///</summary> publicstaticXmlDocumentdoc; ///<summary> ///执行存储过程线程数锁 ///</summary> publicstaticObjectlockTreadCount=newObject(); ///<summary> ///执行存储过程超时时间 ///</summary> publicstaticinttimeout=1000; ///<summary> ///等待执行存储过程时间间隔 ///</summary> publicstaticintinterval=100; ///<summary> ///执行存储过程最大数 ///</summary> publicstaticintmaxRunProcCount=5; ///<summary> ///执行存储过程数 ///</summary> publicstaticintrunProcCount=0; #endregion
#region构造函数 publicFQDService() { InitializeComponent(); } #endregion
#region启动 protectedoverridevoidOnStart(string[]args) { //TODO:在此处添加代码以启动服务。 doc=XMLHelper.GetXmlDocument(); System.Timers.Timertimer=newSystem.Timers.Timer(60*1000); timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(RunProc); timer.Start(); } #endregion
#region结束 protectedoverridevoidOnStop() { //TODO:在此处添加代码以执行停止服务所需的关闭操作。 } #endregion
#region执行存储过程 ///<summary> ///执行存储过程 ///</summary> publicvoidRunProc(objectsender,ElapsedEventArgse) { try { Randomrnd=newRandom(); XmlNoderootNode=doc.SelectSingleNode("settings");
foreach(XmlNodeprocNodeinrootNode.ChildNodes)//遍历Proc { stringprocName=procNode.SelectSingleNode("Name").InnerText.Trim(); stringrunTime=procNode.SelectSingleNode("RunTime").InnerText.Trim();
if(DateTime.Now.ToString("HH:mm")=="14:55") { boolfinish=false;//存储过程是否执行完毕 Threadthread=null; thread=newThread(newParameterizedThreadStart(delegate(objectobj) { #region等待执行存储过程 lock(lockTreadCount) { while(runProcCount>=maxRunProcCount) { Thread.Sleep(interval); } runProcCount++; } #endregion
#region执行存储过程超时处理 ThreadthreadTimer=newThread(newParameterizedThreadStart(delegate(objectobj2) { Thread.Sleep(timeout); if(finish==false) { FileLogger.WriteLog(string.Format("存储过程{0}执行超时",procName)); if(thread!=null) { try { thread.Abort(); } catch(Exceptionex) { FileLogger.WriteErrorLog(string.Format("存储过程{0}终止线程出错:{1}",procName,ex.Message)); } } } })); threadTimer.Start(); #endregion
#region为执行存储过程准备参数 XmlNodeListparamList=procNode.SelectSingleNode("Params").ChildNodes; OracleParameter[]oracleParams=newOracleParameter[paramList.Count]; for(inti=0;i<paramList.Count;i++)//遍历param { XmlNodeparamNode=paramList[i]; stringparamName=paramNode.SelectSingleNode("Name").InnerText.Trim(); stringparamType=paramNode.SelectSingleNode("Type").InnerText.Trim(); stringparamValue=paramNode.SelectSingleNode("Value").InnerText.Trim();
oracleParams[i]=newOracleParameter(paramName,Enum.Parse(typeof(OracleType),paramType)); if((OracleType)Enum.Parse(typeof(OracleType),paramType)==OracleType.DateTime) { DateTimenow=DateTime.Now; string[]paramValueArray=paramValue.Split(':'); oracleParams[i].Value=newDateTime(now.Year,now.Month,now.Day,int.Parse(paramValueArray[0]),int.Parse(paramValueArray[1]),int.Parse(paramValueArray[2])); } else { oracleParams[i].Value=paramValue; } } #endregion
try { try { #region执行存储过程 FileLogger.WriteLog(string.Format("开始执行存储过程{0}",procName));
//执行存储过程 //OracleHelper.RunProcedure(procName,oracleParams);
//模拟执行存储过程 Thread.Sleep(rnd.Next(100,1900));
FileLogger.WriteLog(string.Format("存储过程{0}执行成功",procName)); finish=true; #endregion } catch(Exceptionex) { #region执行存储过程失败日志 StringBuildersbParams=newStringBuilder(); foreach(OracleParameteroracleParaminoracleParams) { sbParams.Append(string.Format("{0}:{1},",oracleParam.ParameterName,oracleParam.Value.ToString())); } stringstrParams=""; if(sbParams.Length>0)strParams=sbParams.ToString(0,sbParams.Length-1); FileLogger.WriteErrorLog(string.Format("存储过程执行失败{0}({1}):{2}",procName,strParams,ex.Message)); #endregion } } catch { //捕获线程终止异常 } finally { runProcCount--; } })); thread.Start(); } } } catch(Exceptionex) { FileLogger.WriteErrorLog(ex.Message); } } #endregion
} }