多线程处理一个问题和多个问题

1.启动多个线程,完成同一个任务(控制台应用程序):

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static internal Thread[] threads = new Thread[10];
        public static void Main()
        {
            Account acc = new Account(10000);
            for (int i = 0; i < 10; i++)
            {
                Thread t = new Thread(new ThreadStart(acc.DoTransactions));
                threads[i] = t;
            }
            for (int i = 0; i < 10; i++)
            {
                threads[i].Name = i.ToString();
            }
            for (int i = 0; i < 10; i++)
            {
                threads[i].Start();
               
            }
            Console.ReadLine();
        }
    }

    internal class Account
    { 
        int balance; //余额
        Random r=new Random(); 
        internal Account(int initial)  
        {  
            balance=initial; 
        }
        internal int Withdraw(int amount) //取回、取款
        { 
            if(balance<0) 
            {  
                //如果balance小于0则抛出异常  
                throw new Exception("NegativeBalance");//负的 余额 
            } 
            //下面的代码保证在当前线程修改balance的值完成之前 
            //不会有其他线程也执行这段代码来修改balance的值  
            //因此,balance的值是不可能小于0的  
            lock(this)  
            { 
                Console.WriteLine("CurrentThread:"+Thread.CurrentThread.Name); 
                //如果没有lock关键字的保护,那么可能在执行完if的条件判断(成立)之后  
                //另外一个线程却执行了balance=balance-amount修改了balance的值 
                //而这个修改对这个线程是不可见的,所以可能导致这时if的条件已经不成立了 
                //但是,这个线程却继续执行 balance=balance-amount,所以导致balance可能小于0 
                if(balance>=amount) 
                { 
                    Thread.Sleep(1000);
                    balance=balance-amount;
                    Console.WriteLine("余下钱:"+ balance.ToString());
                    return  amount; 
                }  else 
                { 
                    return 0;
                    //transactionrejected 
                } 
            }  
        }
        internal void DoTransactions()//取款事务
        {
            //for (int i = 0; i < 100; i++)
            //{
                int index = r.Next(20, 100);
                Console.WriteLine("本次取款" + index.ToString());
                Withdraw(index);
            //}
        }
    }   



    internal class Test  
    {  
     
    } 
} 


2.启动多个线程,完成多个任务

View Code
  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using CommonLibrary.Asynchronous;
 10 using System.Threading;
 11 
 12 namespace WindowsFormsApplication3
 13 {
 14     public partial class Form1 : Form
 15     {
 16         //异步加载对象 
 17         private AsynchLoader _asynchLoader;
 18         public Form1()
 19         {
 20             InitializeComponent();
 21 
 22             //初始化异步变量
 23             _asynchLoader = new AsynchLoader();
 24             _asynchLoader.InvokeParameterizedMethod += AsynchLoadData;
 25             _asynchLoader.InvokeParameterizedMethodCompleted += AsynchLoadDataComplete;
 26             _asynchLoader.ParentControl = this;
 27 
 28        
 29         }
 30         #region 异步操作相关函数
 31 
 32         #region 异步加载入口方法
 33 
 34         /// <summary>
 35         /// 列子
 36         /// </summary>
 37         public void StartAsynch()
 38         {
 39             //下载公共资源信息
 40             LoaderObject loaderObject = new LoaderObject();
 41             loaderObject.Pool = LoaderPool.Pool0;
 42             _asynchLoader.Start(loaderObject);
 43         }
 44         /// <summary>
 45         /// 列子
 46         /// </summary>
 47         public void StartAsynch2()
 48         {
 49             //下载公共资源信息
 50             LoaderObject loaderObject = new LoaderObject();
 51             loaderObject.Pool = LoaderPool.Pool2;
 52             _asynchLoader.Start(loaderObject);
 53         }
 54         /// <summary>
 55         /// 列子
 56         /// </summary>
 57         public void StartAsynch3()
 58         {
 59             //下载公共资源信息
 60             LoaderObject loaderObject = new LoaderObject();
 61             loaderObject.Pool = LoaderPool.Pool3;
 62             _asynchLoader.Start(loaderObject);
 63         }
 64         #endregion
 65 
 66         #region 异步加载线程方法
 67 
 68         /// <summary>
 69         /// 异步方法
 70         /// </summary>
 71         private void AsynchMeth()
 72         {
 73             Thread.Sleep(1000);
 74 
 75         }
 76         /// <summary>
 77         /// 异步方法
 78         /// </summary>
 79         private void AsynchMeth2()
 80         {
 81             Thread.Sleep(5000);
 82            
 83             
 84         }
 85         /// <summary>
 86         /// 异步方法
 87         /// </summary>
 88         private void AsynchMeth3()
 89         {
 90             Thread.Sleep(10000);
 91             
 92            
 93         }
 94         #endregion
 95 
 96         #region 异步加载完成处理方法
 97         private void AsynchLoadComplete()
 98         {
 99             label1.Text="我是0,我完成了";
100         }
101 
102         private void AsynchLoadComplete2()
103         {
104             label2.Text="我是2我完成了";
105         }
106         private void AsynchLoadComplete3()
107         {
108             label3.Text="我是3 我完成了";
109         }
110         #endregion
111 
112         /// <summary>
113         /// 异步加载数据事件方法
114         /// </summary>
115         /// <param name="loaderObject"></param>
116         private void AsynchLoadData(ref LoaderObject loaderObject)
117         {
118             switch (loaderObject.Pool)
119             {
120                 case LoaderPool.Pool0://更新公共资源
121                     this.AsynchMeth();
122                     break;
123                 case LoaderPool.Pool2://更新公共资源
124                     this.AsynchMeth2();
125                     break;
126                 case LoaderPool.Pool3://更新公共资源
127                     this.AsynchMeth3();
128                     break;
129                
130             }
131         }
132 
133         /// <summary>
134         /// 异步加载数据完成事件方法
135         /// </summary>
136         /// <param name="loaderObject"></param>
137         private void AsynchLoadDataComplete(ref LoaderObject loaderObject)
138         {
139             switch (loaderObject.Pool)
140             {
141                 case LoaderPool.Pool0://更新公共资源完成
142                     AsynchLoadComplete();
143                     break;
144                 case LoaderPool.Pool2://更新公共资源完成
145                     AsynchLoadComplete2();
146                     break;
147                 case LoaderPool.Pool3://更新公共资源完成
148                     AsynchLoadComplete3();
149                     break;
150             }
151         }
152 
153         #endregion
154 
155 
156         private void Form1_Load(object sender, EventArgs e)
157         {
158             //启动加载
159             StartAsynch();
160             StartAsynch2();
161             StartAsynch3();
162            
163         }
164 
165 
166     }
167 }
View Code
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Threading;
  5 using System.Windows.Forms;
  6 
  7 namespace CommonLibrary.Asynchronous
  8 {
  9     /// <summary>
 10     /// 线程异步读取器
 11     /// </summary>
 12     public class AsynchLoader
 13     {
 14         //当前运行的线程
 15         private Dictionary<int, Thread> _threadList = new Dictionary<int, Thread>();
 16         //父控件
 17         private System.Windows.Forms.Control parentControl;
 18         
 19         /// <summary>
 20         /// 将关联的特定控件
 21         /// </summary>
 22         public System.Windows.Forms.Control ParentControl
 23         {
 24             get { return parentControl; }
 25             set { parentControl = value; }
 26         }
 27 
 28         private Boolean controlThreadManaged = false;
 29         /// <summary>
 30         /// 是否操作特定控件
 31         /// </summary>
 32         public Boolean ControlThreadManaged
 33         {
 34             get { return controlThreadManaged; }
 35             set { controlThreadManaged = value; }
 36         }
 37 
 38         #region 带参方法的调用事件
 39         /// <summary>
 40         /// 带参数方法的委托
 41         /// </summary>
 42         /// <param name="loaderObject"></param>
 43         public delegate void ParameterizedThreadHandler(ref LoaderObject loaderObject);
 44 
 45         /// <summary>
 46         /// 带参方法的调用事件,需要自行处理控件线程操作
 47         /// </summary>
 48         public event ParameterizedThreadHandler InvokeParameterizedMethod;
 49         private void OnInvokeParameterizedMethod(ref LoaderObject loaderObject)
 50         {
 51             if (InvokeParameterizedMethod != null)
 52             {
 53                 InvokeParameterizedMethod(ref loaderObject);
 54             }
 55         }
 56         /// <summary>
 57         /// 带参方法的调用完成事件,需要自行处理控件线程操作
 58         /// </summary>
 59         public event ParameterizedThreadHandler InvokeParameterizedMethodCompleted;
 60         private void OnInvokeParameterizedMethodCompleted(ref LoaderObject loaderObject)
 61         {
 62             if (InvokeParameterizedMethodCompleted != null)
 63             {
 64                 InvokeParameterizedMethodCompleted(ref loaderObject);
 65             }
 66         }
 67         #endregion 带参方法的调用事件
 68 
 69         #region 不带参方法的调用事件
 70         /// <summary>
 71         /// 不带参数方法的委托
 72         /// </summary>
 73         public delegate void ThreadHandler();
 74         /// <summary>
 75         /// 不带参方法的调用事件
 76         /// </summary>
 77         public event ThreadHandler InvokeMethod;
 78         /// <summary>
 79         /// 触发不带参方法的调用事件
 80         /// </summary>
 81         private void OnInvokeMethod()
 82         {
 83             if (InvokeMethod != null)
 84             {
 85                 InvokeMethod();
 86             }
 87         }
 88 
 89         /// <summary>
 90         /// 不带参数的方法的调用完成事件
 91         /// </summary>
 92         public event ThreadHandler InvokeMethodCompleted;
 93         /// <summary>
 94         /// 触发不带参方法的调用完成事件
 95         /// </summary>
 96         private void OnInvokeMethodCompleted()
 97         {
 98             if (InvokeMethodCompleted != null)
 99             {
100                 InvokeMethodCompleted();
101             }
102         }
103 
104         #endregion 不带参方法的调用事件
105 
106         #region 异常事件
107         /// <summary>
108         /// 异常事件
109         /// </summary>
110         public event DelegateException ThrowException;
111         /// <summary>
112         /// 异常事件触发
113         /// </summary>
114         /// <param name="exception">异常对象</param>
115         protected void OnThrowException(Exception exception)
116         {
117             if (ThrowException != null)
118                 ThrowException(exception);
119         }
120         #endregion 异常事件
121 
122         /// <summary>
123         /// 构造器
124         /// </summary>
125         public AsynchLoader()
126         {
127             _threadList = new Dictionary<int, Thread>();
128             controlThreadManaged = false;
129 
130         }
131 
132         /// <summary>
133         /// 构造器
134         /// </summary>
135         public AsynchLoader(Control ownerControl)
136             : base()
137         {
138             _threadList = new Dictionary<int, Thread>();
139             controlThreadManaged = false;
140             parentControl = ownerControl;
141         }
142 
143         /// <summary>
144         /// 析构函数
145         /// </summary>
146         ~AsynchLoader()
147         {
148             AbortAllThread();
149         }
150 
151         /// <summary>
152         ///终止释放所有线程 
153         /// </summary>
154         public void AbortAllThread()
155         {
156             foreach (var th in _threadList.Values)
157             {
158                 if (th.IsAlive)
159                 {
160                     th.Abort();
161                 }                
162             }
163             _threadList.Clear();
164         }
165 
166         /// <summary>
167         ///终止释放指定的线程 
168         /// </summary>
169         public bool AbortThread(int key)
170         {
171             if (_threadList.ContainsKey(key))
172             {
173                 if (_threadList[key].IsAlive)
174                 {
175                     _threadList[key].Abort();
176                     _threadList.Remove(key);
177                     return true;
178                 }                
179             }
180             return false;
181         } 
182 
183         /// <summary>
184         /// 启动无参数线程
185         /// </summary>
186         /// <returns>返回当前启动线程的唯一ID</returns>
187         public int Start()
188         {
189             Thread th = new Thread(new ThreadStart(InvokeMethodInThread));             
190             th.Start();
191             _threadList.Add(th.ManagedThreadId, th);
192             return th.ManagedThreadId;
193         }
194 
195         /// <summary>
196         /// 启动带参数线程
197         /// </summary>
198         /// <param name="obj"></param>
199         /// <returns>返回当前启动线程的唯一ID</returns>
200         public int Start(LoaderObject loaderObject)
201         {
202             Thread th = new Thread(new ParameterizedThreadStart(InvokeParameterizedMethodInThread));
203             th.Start(loaderObject);
204             _threadList.Add(th.ManagedThreadId, th);
205             return th.ManagedThreadId;
206         }
207 
208         private bool RemoveThread(int key)
209         {
210             return _threadList.Remove(key);          
211         }
212 
213         /// <summary>
214         /// 无参数的线程内方法
215         /// </summary>
216         private void InvokeMethodInThread()
217         {
218             try
219             {
220                 //触发不带参数的方法调用事件
221                 try
222                 {
223                     if (controlThreadManaged || parentControl != null && parentControl.IsHandleCreated)
224                     {
225                         parentControl.BeginInvoke(new ThreadHandler(OnInvokeMethod));
226                     }
227                     else
228                     {
229                         OnInvokeMethod();
230                     }
231                 }
232                 catch (Exception ex)
233                 {
234                     
235                     OnThrowException(ex);
236 
237                 }
238                 //触发不带参数的方法调用完成事件
239                 try
240                 {
241                     if (controlThreadManaged || parentControl != null && parentControl.IsHandleCreated)
242                     {
243                         parentControl.BeginInvoke(new ThreadHandler(OnInvokeMethodCompleted));
244                     }
245                     else
246                     {
247                         OnInvokeMethodCompleted();
248                     }
249                 }
250                 catch (Exception ex)
251                 {
252                     
253                     OnThrowException(ex);
254                 }
255             }
256             finally
257             {
258                 //移除当前线程
259                 RemoveThread(Thread.CurrentThread.ManagedThreadId);
260             }
261         }//end method
262 
263         /// <summary>
264         /// 带参数的线程内的方法
265         /// </summary>
266         /// <param name="obj"></param>
267         private void InvokeParameterizedMethodInThread(object obj)
268         {
269             LoaderObject loaderObject = obj as LoaderObject;
270             try
271             {
272                 //触发带参数的方法调用事件
273                 try
274                 {
275                     //if (controlThreadManaged || parentControl != null && parentControl.IsHandleCreated)
276                     //{
277                     //    parentControl.BeginInvoke(new ParameterizedThreadHandler(OnInvokeParameterizedMethod), new object[] { loaderObject });
278                     //}
279                     //else
280                     //{
281                     //    OnInvokeParameterizedMethod(ref loaderObject);
282                     //}
283                     OnInvokeParameterizedMethod(ref loaderObject);
284 
285 
286                 }
287                 catch (Exception ex)
288                 {
289                    
290                     OnThrowException(ex);
291 #if DEBUG
292                     throw ex;
293 #endif
294                 }
295                 //触发带参数的方法调用完成事件
296                 try
297                 {
298                     if (controlThreadManaged || parentControl != null && parentControl.IsHandleCreated)
299                     {
300                         parentControl.BeginInvoke(new ParameterizedThreadHandler(OnInvokeParameterizedMethodCompleted), new object[] { loaderObject });
301                     }
302                     else
303                     {
304                         OnInvokeParameterizedMethodCompleted(ref loaderObject);
305                     }
306                 }
307                 catch (Exception ex)
308                 {
309                    
310                     OnThrowException(ex);
311                 }
312             }
313             finally
314             {
315                 //移除当前线程
316                 RemoveThread(Thread.CurrentThread.ManagedThreadId);
317             }
318         }//end method
319 
320     }//end class
321 }//end namespace
View Code
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace CommonLibrary.Asynchronous
 6 {
 7 
 8     /// <summary>
 9     /// 识别读取池(一般默认为Pool0,在同一界面中使用多个线程控制时可以使用)
10     /// </summary>
11     public enum LoaderPool
12     {
13         Pool0,
14         Pool1,
15         Pool2,
16         Pool3,
17         Pool4,
18         Pool5,
19         Pool6,
20         Pool7,
21         Pool8,
22         Pool9
23     }
24 
25     /// <summary>
26     /// 异步读取器对象
27     /// </summary>
28     public class LoaderObject
29     {
30         /// <summary>
31         /// 数据对象
32         /// </summary>
33         private object _obj = new object();
34         /// <summary>
35         /// 数据对象
36         /// </summary>
37         public object Obj
38         {
39             get
40             {
41                 return _obj;
42             }
43             set
44             {
45                 _obj = value;
46             }
47         }
48 
49         /// <summary>
50         /// 异步池(一般默认为pool0,在同一界面中使用多个线程控制时可以使用)
51         /// </summary>
52         private LoaderPool _pool = LoaderPool.Pool0;
53         /// <summary>
54         /// 异步池(一般默认为pool0,在同一界面中使用多个线程控制时可以使用)
55         /// </summary>
56         public LoaderPool Pool
57         {
58             get
59             {
60                 return _pool;
61             }
62             set
63             {
64                 _pool = value;
65             }
66         }
67         /// <summary>
68         /// 数据对象
69         /// </summary>
70         private object _data;
71         /// <summary>
72         /// 数据对象
73         /// </summary>
74         public object Data
75         {
76             get
77             {
78                 return _data;
79             }
80             set
81             {
82                 _data = value;
83             }
84         }
85     }
86 }
View Code
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace CommonLibrary.Asynchronous
 6 {
 7     /// <summary>
 8     /// 异常委托
 9     /// </summary>
10     /// <param name="exception">异常对象</param>
11     public delegate void DelegateException(Exception exception);
12 
13     /// <summary>
14     /// 提示信息委托
15     /// </summary>
16     /// <param name="hintInformation">提示信息</param>
17     public delegate void DelegateHintInformation(string hintInformation);
18 
19     class SystemUtils
20     {
21     }
22 }
原文地址:https://www.cnblogs.com/chengjunwei/p/2751547.html