原帖:http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/6164b1a7-aa2d-4d7f-bd7a-f316a90bc66f // 下面的示例代码通过调用 DoSleep 方法动态的调整单个线程的 Sleep 时间 // 来达到平衡每个线程的处理能力, 希望对你有帮助 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static Dictionary<string, Int32> ExecuteCount = new Dictionary<string, int>(); static Dictionary<string, Int32> SleepTime = new Dictionary<string, int>(); static List<Thread> ThreadList = new List<Thread>(); static void Main(string[] args) { for (int i = 0; i < 3; i++) { Thread t1 = new Thread(F1); t1.Name = string.Format("第({0})组,线程(1)", i); Thread t2 = new Thread(F1); t2.Name = string.Format("第({0})组,线程(2)", i); Thread t3 = new Thread(F1); t3.Name = string.Format("第({0})组,线程(3)", i); ExecuteCount.Add(t1.Name, 0); ExecuteCount.Add(t2.Name, 0); ExecuteCount.Add(t3.Name, 0); SleepTime.Add(t1.Name, 1); SleepTime.Add(t2.Name, 1); SleepTime.Add(t3.Name, 1); ThreadList.Add(t1); ThreadList.Add(t2); ThreadList.Add(t3); } foreach (Thread thread in ThreadList) thread.Start(); } private static void F1() { while (true) { WriteErrorLog(); DoSleep(); } } //private static void F2() //{ // while (true) // { // WriteErrorLog(); // DoSleep(); // } //} //private static void F3() //{ // while (true) // { // WriteErrorLog(); // DoSleep(); // } //} /// <summary> /// 根据当前线程在整个纯程数组中的执行情况动态调整它的 Sleep 时间 /// </summary> static void DoSleep() { if (ExecuteCount[Thread.CurrentThread.Name] > ExecuteCount.Values.Min()) { // 如果某个线程运行速度快,那么增加它的 Sleep 时间 SleepTime[Thread.CurrentThread.Name]++; } else { // 如果某个线程运行速度最慢,那么减少它的 Sleep 时间 if (SleepTime[Thread.CurrentThread.Name] > 1) SleepTime[Thread.CurrentThread.Name] = 1; } Thread.Sleep(SleepTime[Thread.CurrentThread.Name]); } static DateTime fBegin = DateTime.Now; /// <summary> /// 获取所有线程的整体执行速度,单位:秒 /// </summary> static Decimal Speed { get { Decimal executeSeconds = (Decimal)(DateTime.Now - fBegin).TotalSeconds; Decimal executeCount = (Decimal)ExecuteCount.Values.Sum(); return Decimal.Round(executeCount / executeSeconds, 2); } } static object lockObj = new object(); private static void WriteErrorLog() { lock (lockObj) { Thread.Sleep(1); Console.WriteLine(Thread.CurrentThread.Name + " " + DateTime.Now.ToString("HH:mm:ss.fffffff") + " " + ExecuteCount[Thread.CurrentThread.Name].ToString() + " " + SleepTime[Thread.CurrentThread.Name].ToString() + " " + Speed.ToString()); ExecuteCount[Thread.CurrentThread.Name]++; if (ExecuteCount[Thread.CurrentThread.Name] % 500 == 0) { Console.WriteLine("================================================="); foreach (KeyValuePair<string, int> kv in ExecuteCount) Console.WriteLine(string.Format("{0} {1}", kv.Key, kv.Value)); Console.WriteLine("================================================="); Console.WriteLine("press any key to contuine ..."); Console.ReadKey(); } } } } }