自制线程池4

需求:

有一种任务需要定时的执行,而且非常的耗时,因此我把它放到线程池中执行,并设置线程池为1,如果该任务已经在队列中或正在执行该任务,则不要再将该任务加入线程池中了。

测试代码如下

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 using ThreadPool2;
 7 
 8 namespace ThreadPoolTest.MyThreadPool2Test
 9 {
10     class Class6
11     {
12         static void Main(string[] args)
13         {
14             MyThreadPool2 pool=new MyThreadPool2(1,true,30000);
15             object obj=new object();
16             Random rnd=new Random();
17             for (var i = 0; i < 20;i++ )
18                 pool.QueueUserWorkItem(call, obj, rnd.Next(1,4).ToString(), succ, err);
19             Console.ReadLine();
20         }
21 
22         private static void err(object state)
23         {
24                 Console.WriteLine("err自制线程池4");
25         }
26 
27         private static void succ(object state, object result)
28         {
29             Console.WriteLine("succ自制线程池4");
30         }
31 
32         private static object call(object state)
33         {
34             while(true)
35             {
36                 Thread.Sleep(2000);
37                 Console.WriteLine("exec自制线程池4自制线程池4");
38             }
39         }
40     }
41 }
42 

 

自制线程池4

线程池代码如下,

 

自制线程池4using System;
自制线程池4
using System.Collections;
自制线程池4
using System.Collections.Generic;
自制线程池4
using System.Diagnostics;
自制线程池4
using System.Linq;
自制线程池4
using System.Text;
自制线程池4
using System.Threading;
自制线程池4
using Amib.Threading.Internal;
自制线程池4
using Rhino.Commons;
自制线程池4
自制线程池4
namespace ThreadPool2
自制线程池4自制线程池4
自制线程池4{
自制线程池4    
public delegate object WaitCallback2(object state);
自制线程池4    
public delegate void SuccCallback(object state, object result);
自制线程池4    
public delegate void ErrCallback(object state);
自制线程池4自制线程池4    
/**//// <summary>
自制线程池4    
/// 此线程池的作用是将某一类特殊的任务交给此线程池执行,
自制线程池4    
/// 可以设定该线程池的最大线程数,
自制线程池4    
/// 这类线程池的优点时,占用的资源少,优先级低,
自制线程池4    
/// 适合于执行任务需要长期执行,不考虑时间因素的任务
自制线程池4    
/// 同时根据在传入线程池时的标记key,可以Aborted指定任务,
自制线程池4    
/// 若该任务正在执行或尚在执行队列中
自制线程池4    
/// </summary>

自制线程池4    public class MyThreadPool2
自制线程池4自制线程池4    
自制线程池4{
自制线程池4自制线程池4        
/**//// <summary>
自制线程池4        
/// 任务执行队列
自制线程池4        
/// </summary>

自制线程池4        //static ThreadSafeQueue<WorkerThread> queue = new ThreadSafeQueue<WorkerThread>();
自制线程池4
        List<WorkerThread> queue = new List<WorkerThread>();
自制线程池4自制线程池4        
/**//// <summary>
自制线程池4        
/// 目前暂定为只使用一个线程,以免耗近资源
自制线程池4        
/// </summary>

自制线程池4        SynchronizedDictionary<string, WorkerThread> dict = new SynchronizedDictionary<string, WorkerThread>();
自制线程池4        
private object state;
自制线程池4        AutoResetEvent wait 
= new AutoResetEvent(false);
自制线程池4        AutoResetEvent wait2 
= new AutoResetEvent(false);
自制线程池4自制线程池4        
private int MaxLimitedTime 自制线程池4getset; }
自制线程池4自制线程池4        
private bool IsLimitedExecTime 自制线程池4getset; }
自制线程池4自制线程池4        
private int IdleTimeout 自制线程池4getset; }
自制线程池4        
//private static int _maxThreadNum = 1;
自制线程池4
        private int MaxThreadNum
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
//get { return _maxThreadNum; }
自制线程池4            
//set { _maxThreadNum = value; }
自制线程池4
            get;
自制线程池4            
set;
自制线程池4        }

自制线程池4        
private MyThreadPool2()
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
//System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state, 2000,true);
自制线程池4            
//SetMaxThreadNum(2);
自制线程池4            
//SetMaxExecTime(false, 10000);
自制线程池4
        }

自制线程池4自制线程池4        
/**//// <summary>
自制线程池4        
/// 设置专用线程池的初始参数
自制线程池4        
/// </summary>
自制线程池4        
/// <param name="num">线程池的最大线程数,最小为1</param>
自制线程池4        
/// <param name="b">是否起用限制最大单个任务执行时间设定</param>
自制线程池4        
/// <param name="MaxLimitedTime">单个任务执行的最大时间</param>

自制线程池4        public MyThreadPool2(int num, bool b, int MaxLimitedTime)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, 
new WaitOrTimerCallback(aa), state, 2000true);
自制线程池4            
if (num < 1)
自制线程池4                num 
= 1;
自制线程池4            MaxThreadNum 
= num;
自制线程池4            IsLimitedExecTime 
= b;
自制线程池4            
this.MaxLimitedTime = MaxLimitedTime;
自制线程池4            
if (IsLimitedExecTime)
自制线程池4                System.Threading.ThreadPool.RegisterWaitForSingleObject(wait2, 
new WaitOrTimerCallback(bb), state,
自制线程池4                                                                        
this.MaxLimitedTime, true);
自制线程池4        }

自制线程池4
自制线程池4自制线程池4        
/**//// <summary>
自制线程池4        
/// 定时将队列中的数据装载到线程中执行,如果还没有到达最大线程数还有任务则创建线程
自制线程池4        
/// </summary>
自制线程池4        
/// <param name="state"></param>
自制线程池4        
/// <param name="timedOut"></param>

自制线程池4        private void aa(object state, bool timedOut)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
//Console.WriteLine("执行aa()将队列中的任务加到线程中");
自制线程池4自制线程池4
            lock(WorkerThread.Manual)自制线程池4{
自制线程池4            WorkerThread.Manual.Reset();
自制线程池4            
lock (queue)
自制线程池4自制线程池4            
自制线程池4{
自制线程池4                Console.WriteLine(
"queue count={0}",queue.Count);
自制线程池4                
//判断任务队列中有无积压的任务且有无空闲的线程,如果符合上述条件则执行之
自制线程池4
                List<string> removeKey = new List<string>();
自制线程池4                List
<WorkerThread> newTask = new List<WorkerThread>();
自制线程池4                List
<string> tasks = new List<string>();
自制线程池4                
//Dictionary<string,WorkerThread> addDict=new Dictionary<string, WorkerThread>();
自制线程池4
                foreach (var kvp in dict)
自制线程池4自制线程池4                
自制线程池4{//kvp.Value.ThreadState == ThreadState.Unstarted || 
自制线程池4                    
//if (kvp.Value.Thread.ThreadState == ThreadState.Suspended)
自制线程池4
自制线程池4                    
//将不活动的线程记录下来并移除
自制线程池4
                    if (!kvp.Value.Thread.IsAlive)
自制线程池4                        tasks.Add(kvp.Key);
自制线程池4                    
//将活动且空闲的线程赋于新的任务
自制线程池4
                    if (kvp.Value.Thread.IsAlive == true && kvp.Value.CurrentThreadState == WorkerThreadState.Idle)
自制线程池4自制线程池4                    
自制线程池4{
自制线程池4                        
//dict.Remove(kvp.Key);//cancle because of lock
自制线程池4

自制线程池4                        WorkerThread a 
= queue.FirstOrDefault();
自制线程池4                        
if (a != null)
自制线程池4自制线程池4                        
自制线程池4{
自制线程池4                            removeKey.Add(kvp.Key);
自制线程池4                            
//addDict.Add(a.Key, kvp.Value.Change(a));
自制线程池4
                            newTask.Add(kvp.Value.Change(a));
自制线程池4                            
//a.Thread = kvp.Value.Thread;
自制线程池4                            
//newTask.Add(a);
自制线程池4
                            queue.RemoveAt(0);
自制线程池4                            
//dict.Add(a.Key, kvp.Value.Change(a));//cancle because of lock
自制线程池4                            
//将参数加到线程中,并改变线程的状态
自制线程池4                            
//dict[a.Key].Thread.Resume();
自制线程池4
                        }

自制线程池4                        
else
自制线程池4                            
break;
自制线程池4                        
//else
自制线程池4                        
//{
自制线程池4                        
//    System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, new WaitOrTimerCallback(aa), state,
自制线程池4                        
//                                                            2000, true);
自制线程池4                        
//    return;
自制线程池4                        
//}
自制线程池4

自制线程池4                    }

自制线程池4                }

自制线程池4                tasks.ForEach(t 
=> 
自制线程池4自制线程池4                
自制线程池4
自制线程池4                    dict.Remove(t);
自制线程池4                    Debug.WriteLine(
"移除销毁线程对应的dict中的键值项,key="+t);
自制线程池4                }
);
自制线程池4                removeKey.ForEach(t 
=> dict.Remove(t));
自制线程池4                newTask.ForEach(t 
=>
自制线程池4自制线程池4                
自制线程池4{
自制线程池4                    Debug.WriteLine(
"复用线程用于执行新任务"+t.Key);
自制线程池4                    dict.Add(t.Key, t);
自制线程池4                    
//t.StartExecTime = DateTime.Now;
自制线程池4
                    t.Auto.Set();
自制线程池4                    
//t.CurrentThreadState = WorkerThreadState.Busy;
自制线程池4                    
//t.Thread.Resume();
自制线程池4
                }
);
自制线程池4                
while (queue.Count > 0 && dict.Count < MaxThreadNum)
自制线程池4自制线程池4                
自制线程池4{
自制线程池4                    
//未到线程池最大池程数时,增加线程
自制线程池4
                    WorkerThread b = queue.FirstOrDefault();
自制线程池4                    
if (b != null)
自制线程池4自制线程池4                    
自制线程池4{
自制线程池4                        queue.RemoveAt(
0);
自制线程池4                        
//Thread thd = new Thread(new ThreadStart(b.Exec));
自制线程池4                        
//thd.Priority = ThreadPriority.Lowest;
自制线程池4                        
//dict.Add(b.Key, thd);
自制线程池4                        
//thd.Start();
自制线程池4
                        WorkerThread wt = new WorkerThread();
自制线程池4                        wt.Start(b);
自制线程池4                        dict.Add(wt.Key, wt);
自制线程池4                        wt.Thread.Start();
自制线程池4                        Debug.WriteLine(
"新建线程用于执行新任务"+ wt.Key);
自制线程池4
自制线程池4
自制线程池4                        
//将参数加到线程中,并改变线程的状态
自制线程池4
                    }

自制线程池4
自制线程池4
自制线程池4                }

自制线程池4                System.Threading.ThreadPool.RegisterWaitForSingleObject(wait, 
new WaitOrTimerCallback(aa), state, 2000,
自制线程池4                                                                        
true);
自制线程池4            }

自制线程池4            WorkerThread.Manual.Set();
自制线程池4            }

自制线程池4        }

自制线程池4        
private void SetMaxThreadNum(int num)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
if (num < 1)
自制线程池4                num 
= 1;
自制线程池4            MaxThreadNum 
= num;
自制线程池4        }

自制线程池4        
private WorkerThread FindSpecificWorkerThreadByKey(string key)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            WorkerThread wt;
自制线程池4            dict.TryGetValue(key, 
out wt);
自制线程池4            
return wt;
自制线程池4        }

自制线程池4自制线程池4        
/**//// <summary>
自制线程池4        
/// 设定单线程允许执行任务的最长时间,该方法不能在运行时改变,须事前设定
自制线程池4        
/// </summary>
自制线程池4        
/// <param name="b"></param>
自制线程池4        
/// <param name="time"></param>

自制线程池4        [Obsolete("abandon")]
自制线程池4        
private void SetMaxExecTime(bool b, int time)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            IsLimitedExecTime 
= b;
自制线程池4            MaxLimitedTime 
= time;
自制线程池4            
if (IsLimitedExecTime)
自制线程池4                System.Threading.ThreadPool.RegisterWaitForSingleObject(wait2, 
new WaitOrTimerCallback(bb), state,
自制线程池4                                                                        MaxLimitedTime, 
true);
自制线程池4        }

自制线程池4自制线程池4        
/**//// <summary>
自制线程池4        
/// 当任务执行超时时,注销该线程
自制线程池4        
/// </summary>
自制线程池4        
/// <param name="state"></param>
自制线程池4        
/// <param name="timedOut"></param>

自制线程池4        private void bb(object state, bool timedOut)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
//GC.Collect();
自制线程池4
            Console.WriteLine("执行bb(),检测是否有线程超时");
自制线程池4            
lock (WorkerThread.Manual)
自制线程池4自制线程池4            
自制线程池4{
自制线程池4                WorkerThread.Manual.Reset();
自制线程池4                
//lock (obj)
自制线程池4
                lock (dict.SyncRoot)
自制线程池4自制线程池4                
自制线程池4{
自制线程池4                    List
<string> temp = new List<string>();
自制线程池4                    
foreach (var kvp in dict)
自制线程池4自制线程池4                    
自制线程池4{
自制线程池4                        
if (kvp.Value.CurrentThreadState==WorkerThreadState.Busy &&DateTime.Now.Subtract(kvp.Value.StartExecTime).TotalMilliseconds > MaxLimitedTime)
自制线程池4自制线程池4                        
自制线程池4{
自制线程池4                            Console.WriteLine(
"now={0}",DateTime.Now);
自制线程池4                            Console.WriteLine(
"before={0}",kvp.Value.StartExecTime);
自制线程池4                            temp.Add(kvp.Key);
自制线程池4                        }

自制线程池4                    }

自制线程池4                    
foreach (var s in temp)
自制线程池4自制线程池4                    
自制线程池4{
自制线程池4                        Debug.WriteLine(
"key="+s+"的任务超时,执行该任务的线程将被销毁");
自制线程池4                        _Aborted(s);
自制线程池4                    }

自制线程池4                    System.Threading.ThreadPool.RegisterWaitForSingleObject(wait2, 
new WaitOrTimerCallback(bb), state, MaxLimitedTime, true);
自制线程池4                }

自制线程池4                WorkerThread.Manual.Set();
自制线程池4            }

自制线程池4
自制线程池4        }

自制线程池4        
public void Aborted(string key)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
lock (WorkerThread.Manual)
自制线程池4自制线程池4            
自制线程池4{
自制线程池4                WorkerThread.Manual.Reset();
自制线程池4                _Aborted(key);
自制线程池4                WorkerThread.Manual.Set();
自制线程池4            }

自制线程池4        }

自制线程池4
自制线程池4        
private void _Aborted(string key)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
lock (queue)
自制线程池4自制线程池4            
自制线程池4{
自制线程池4                
//任务如果还在队列中则删除该任务
自制线程池4
                int index = queue.FindIndex(t => t.Key == key);
自制线程池4                
if (index > -1)
自制线程池4自制线程池4                
自制线程池4{
自制线程池4                    queue.RemoveAt(index);
自制线程池4                    Debug.WriteLine(
"从任务队列中移除指定key="+key+"的任务");
自制线程池4                }

自制线程池4            }

自制线程池4            
//lock (dict.SyncRoot)
自制线程池4            
//{
自制线程池4自制线程池4
                old way now extract method FindSpecificWorkerThreadByKey to split this#region old way now extract method FindSpecificWorkerThreadByKey to split this
自制线程池4                
//WorkerThread v;
自制线程池4                
//if (dict.TryGetValue(key, out v))
自制线程池4                
//{
自制线程池4                
//    v.Thread.Abort();
自制线程池4                
//    //在调用Abort方法时,在指定线程上引发ThreadAbortException。以开始终止此线程的
自制线程池4                
//    //过程。ThreadAbortException是—个可以由应用程序代码捕获的特殊异常,但除非调用
自制线程池4                
//    //ResetAbort,否则会在catch块的结尾再次引发它。ResetAbod可以取消Abort的请求,并
自制线程池4                
//    //阻止ThreadAbortException终止此线程。但是,线程不一定会立即中止,或者根本不中止。
自制线程池4                
//    //如果线程在作为中止过程的一部分被调用的finally块中做非常大量的计算,从而无限期延
自制线程池4                
//    //迟中止操作,则会发生这种情况。若要确保线程已经终止,请在调用Abort之后对线程调
自制线程池4                
//    //用Join方法。
自制线程池4                
//    v.Thread.Join();
自制线程池4                
//    dict.Remove(key);
自制线程池4                
//}
自制线程池4
                #endregion

自制线程池4                WorkerThread v 
= FindSpecificWorkerThreadByKey(key);
自制线程池4                
//没有发现指定key的线程表示,对应该key的任务已经执行完了,不需要再来取消该任务
自制线程池4                
//或者指的key的线程虽然还在但它的状态已变为suspended,任务已完成,将等待下一个任务,实际不需要终止该线程
自制线程池4                
//只有但指定的key的任务在执行时才删除
自制线程池4                
//if (v != null && v.Thread.ThreadState != ThreadState.Suspended)
自制线程池4
                if (v != null && v.CurrentThreadState == WorkerThreadState.Busy)
自制线程池4自制线程池4                
自制线程池4{
自制线程池4                    dict.Remove(key);
自制线程池4自制线程池4                    
/**//*
自制线程池4                在调用Abort方法时,在指定线程上引发ThreadAbortException。以开始终止此线程的
自制线程池4                过程。ThreadAbortException是—个可以由应用程序代码捕获的特殊异常,但除非调用
自制线程池4                ResetAbort,否则会在catch块的结尾再次引发它。ResetAbod可以取消Abort的请求,并
自制线程池4                阻止ThreadAbortException终止此线程。但是,线程不一定会立即中止,或者根本不中止。
自制线程池4                如果线程在作为中止过程的一部分被调用的finally块中做非常大量的计算,从而无限期延
自制线程池4                迟中止操作,则会发生这种情况。若要确保线程已经终止,请在调用Abort之后对线程调
自制线程池4                用Join方法。
自制线程池4                
*/

自制线程池4                    
自制线程池4                    Debug.WriteLine(
"销毁正在执行Key="+key+"的任务的线程");
自制线程池4                    
//这里将回调的方法放线程终止之前,是防止在同一线程时,线程终止了,放在后面回调就不执行了
自制线程池4
                    if (v.ErrorCallback != null)
自制线程池4自制线程池4                    
自制线程池4{
自制线程池4                        v.ErrorCallback(v.State);
自制线程池4                        
//最后完成任务的时间
自制线程池4
                        v.EndExecTime = DateTime.Now;
自制线程池4                    }

自制线程池4                    v.Thread.Abort();
自制线程池4                    v.Thread.Join();
自制线程池4
自制线程池4
自制线程池4                }

自制线程池4            
//}
自制线程池4
自制线程池4                
//wait.Set();
自制线程池4
        }

自制线程池4
自制线程池4        
public void QueueUserWorkItem(WaitCallback2 callback, object state, string key, SuccCallback succ, ErrCallback err)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            WorkerThread.Manual.Reset();
自制线程池4            WorkerThread p 
= new WorkerThread()
自制线程池4自制线程池4            
自制线程池4{
自制线程池4                WaitCallback 
= callback,
自制线程池4                State 
= state,
自制线程池4                Key 
= key,
自制线程池4                ErrorCallback 
= err,
自制线程池4                SuccessCallback 
= succ
自制线程池4            }
;
自制线程池4            
//queue.Enqueue(p);
自制线程池4
            lock (queue)
自制线程池4自制线程池4            
自制线程池4{
自制线程池4                
if(queue.FindIndex(t=>t.Key==p.Key)==-1 && dict.Contains(p.Key)==false)
自制线程池4自制线程池4                
自制线程池4{
自制线程池4                    queue.Add(p);
自制线程池4                    wait.Set();
自制线程池4                }

自制线程池4                
else
自制线程池4自制线程池4                
自制线程池4{
自制线程池4                    Console.WriteLine(
"由于队列或是正在执行的线程中拥有一个同名的key,此次加入线程的工作将被自动抛弃");
自制线程池4                }

自制线程池4                
//Monitor.Pulse(queue);
自制线程池4
            }

自制线程池4            WorkerThread.Manual.Set();
自制线程池4        }

自制线程池4        
public void QueueUserWorkItem(WaitCallback2 callback, object state, SuccCallback succ, ErrCallback err)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            QueueUserWorkItem(callback, state, System.Guid.NewGuid().ToString(), succ, err);
自制线程池4        }

自制线程池4
自制线程池4        
public void QueueUserWorkItem(WaitCallback2 callback, object state, string key)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
//WorkerThread p = new WorkerThread()
自制线程池4            
//            {
自制线程池4            
//                WaitCallback = callback,
自制线程池4            
//                State = state,
自制线程池4            
//                Key = key
自制线程池4            
//            };
自制线程池4自制线程池4
            /**/////queue.Enqueue(p);
自制线程池4            //queue.Add(p);
自制线程池4            
//wait.Set();
自制线程池4
            QueueUserWorkItem(callback, state, key, nullnull);
自制线程池4        }

自制线程池4        
public void QueueUserWorkItem(WaitCallback2 callback, object state)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            QueueUserWorkItem(callback, state, System.Guid.NewGuid().ToString());
自制线程池4        }

自制线程池4
自制线程池4    }

自制线程池4    
public enum WorkerThreadState : byte
自制线程池4自制线程池4    
自制线程池4{
自制线程池4        None 
= 0,
自制线程池4        Busy 
= 1,
自制线程池4        Idle 
= 2
自制线程池4    }

自制线程池4    
public class WorkerThread
自制线程池4自制线程池4    
自制线程池4{
自制线程池4        
public AutoResetEvent Auto = new AutoResetEvent(false);
自制线程池4        
public static ManualResetEvent Manual = new ManualResetEvent(true);
自制线程池4自制线程池4        
public WorkerThreadState CurrentThreadState 自制线程池4getset; }
自制线程池4自制线程池4        
public DateTime StartExecTime 自制线程池4getset; }
自制线程池4自制线程池4        
public DateTime EndExecTime 自制线程池4getset; }
自制线程池4自制线程池4        
public Thread Thread 自制线程池4getset; }
自制线程池4自制线程池4        
public string Key 自制线程池4getset; }
自制线程池4自制线程池4        
public WaitCallback2 WaitCallback 自制线程池4getset; }
自制线程池4自制线程池4        
public SuccCallback SuccessCallback 自制线程池4getset; }
自制线程池4自制线程池4        
public ErrCallback ErrorCallback 自制线程池4getset; }
自制线程池4自制线程池4        
public Object State 自制线程池4getset; }
自制线程池4        
public void Exec()
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
while (true)
自制线程池4自制线程池4            
自制线程池4{
自制线程池4                
this.CurrentThreadState = WorkerThreadState.Busy;
自制线程池4                
this.StartExecTime = DateTime.Now;
自制线程池4                
if (this.SuccessCallback != null)
自制线程池4                    
this.SuccessCallback(this.State, this.WaitCallback(this.State));
自制线程池4                
else
自制线程池4                    
this.WaitCallback(this.State);//如何将执行的结果返回,目前是通过SuccessCallback将结果作为参数返回,如果没有使用SuccessCallback将不能返回执行的结果
自制线程池4
                this.EndExecTime = DateTime.Now;
自制线程池4                
//如何将任务执行的起讫时间发给任务
自制线程池4
                this.CurrentThreadState = WorkerThreadState.Idle;
自制线程池4                
//this.Thread.Suspend();
自制线程池4                
//等待60s如果在此期间未接收到新的任务该线程就退出
自制线程池4
                if (!Auto.WaitOne(60 * 1000false))
自制线程池4                    
break;
自制线程池4                Manual.WaitOne();
自制线程池4            }

自制线程池4            Debug.WriteLine(
"线程销毁");
自制线程池4        }

自制线程池4        
public WorkerThread Change(WorkerThread wt)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
this.Key = wt.Key;
自制线程池4            
this.WaitCallback = wt.WaitCallback;
自制线程池4            
this.State = wt.State;
自制线程池4            
//this.StartExecTime = wt.StartExecTime;
自制线程池4
            this.ErrorCallback = wt.ErrorCallback;
自制线程池4            
this.SuccessCallback = wt.SuccessCallback;
自制线程池4            
return this;
自制线程池4        }

自制线程池4        
public void Start(WorkerThread wt)
自制线程池4自制线程池4        
自制线程池4{
自制线程池4            
this.Change(wt);
自制线程池4            
this.Thread = new Thread(new ThreadStart(this.Exec));
自制线程池4            
this.Thread.Priority = ThreadPriority.Lowest;
自制线程池4        }

自制线程池4
自制线程池4        
//public void Start(WaitCallback callback,Object state)
自制线程池4        
//{
自制线程池4        
//    this.WaitCallback = callback;
自制线程池4        
//    this.State = state;
自制线程池4        
//    if(this.Thread==null){
自制线程池4        
//        this.Thread = new Thread(new ThreadStart(this.Exec));
自制线程池4        
//        this.Thread.Priority = ThreadPriority.Lowest;
自制线程池4        
//        this.Thread.IsBackground = true;
自制线程池4        
//        this.Thread.Start();
自制线程池4        
//        return;
自制线程池4        
//    }
自制线程池4        
//    if(this.Thread.ThreadState==ThreadState.Suspended)
自制线程池4        
//    {
自制线程池4        
//        this.Thread.Resume();
自制线程池4        
//    }
自制线程池4        
//}
自制线程池4
    }

自制线程池4}

自制线程池4
自制线程池4
自制线程池4
自制线程池4

 

 

posted on 2008-08-24 22:28 lexus 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lexus/archive/2008/08/24/1275323.html