本文实例讲述了C#线程执行超时处理与并发线程数控制的方法。分享给大家供大家参考。具体实现方法如下:
特别说明:
1、为了测试方便,这里对存储过程的执行是模拟的
2、这里限制了并发执行存储过程的最大个数,但并没有对并发线程数进行控制,与文章标题略有不符,但程序稍做改动即可控制并发线程数
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OracleClient;
using System.Diagnostics;
using System.IO;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Timers;
using System.Xml;
using DBUtil;
using FQDService.Utils;
namespace FQDService
{
/// <summary>
/// FQD服务
/// </summary>
partial class FQDService : ServiceBase
{
#region 变量
/// <summary>
/// 存储过程配置文档
/// </summary>
public static XmlDocument doc;
/// <summary>
/// 执行存储过程线程数锁
/// </summary>
public static Object lockTreadCount = new Object();
/// <summary>
/// 执行存储过程超时时间
/// </summary>
public static int timeout = 1000;
/// <summary>
/// 等待执行存储过程时间间隔
/// </summary>
public static int interval = 100;
/// <summary>
/// 执行存储过程最大数
/// </summary>
public static int maxRunProcCount = 5;
/// <summary>
/// 执行存储过程数
/// </summary>
public static int runProcCount = 0;
#endregion
#region 构造函数
public FQDService()
{
InitializeComponent();
}
#endregion
#region 启动
protected override void OnStart(string[] args)
{
// TODO: 在此处添加代码以启动服务。
doc = XMLHelper.GetXmlDocument();
System.Timers.Timer timer = new System.Timers.Timer(60 * 1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(RunProc);
timer.Start();
}
#endregion
#region 结束
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
}
#endregion
#region 执行存储过程
/// <summary>
/// 执行存储过程
/// </summary>
public void RunProc(object sender, ElapsedEventArgs e)
{
try
{
Random rnd = new Random();
XmlNode rootNode = doc.SelectSingleNode("settings");
foreach (XmlNode procNode in rootNode.ChildNodes) // 遍历Proc
{
string procName = procNode.SelectSingleNode("Name").InnerText.Trim();
string runTime = procNode.SelectSingleNode("RunTime").InnerText.Trim();
if (DateTime.Now.ToString("HH:mm") == "14:55")
{
bool finish = false; //存储过程是否执行完毕
Thread thread = null;
thread = new Thread(new ParameterizedThreadStart(delegate(object obj)
{
#region 等待执行存储过程
lock (lockTreadCount)
&