多线程 执行 多任务

来源:互联网 发布:为尔商城是传销网络吗 编辑:程序博客网 时间:2024/04/28 08:28

今天刚刚把自动更新程序写完,说下多线程执行多任务的思路。

 

如果有错误请大家指证!

 

 

 

 

我的这个程序是可以自己设定线程数目的,点击按钮执行多线程任务。

 

下面开始

 

1:我先把每个任务都写成用户控件,在用户控件里存储要执行的信息,并可以单独执行该任务。

 

2:使用线程池控制每个任务。

 

3:每个线程结束判断并触发执行下个任务。

 

下面看代码吧。

 

 

 

//开线程
                ThreadObject = new Thread[ProgressArrayLength];

                if (Thread_Num <= ProgressArrayLength)
                {
                    for (int j = 0; j < Thread_Num; j++)
                    {
                        ThreadPool.QueueUserWorkItem(new WaitCallback(((UserProgressbar)ProgressbarPanel.Controls[j]).ExecUpdate));

                        ThreadNow_Num++; 
                        
                        ThreadID++;
                    }
                }
                else
                {
                    for (int j = 0; j < ProgressArrayLength; j++)
                    {
                        ThreadPool.QueueUserWorkItem(new WaitCallback(((UserProgressbar)ProgressbarPanel.Controls[j]).ExecUpdate));
                        ThreadNow_Num++;
                        ThreadID++;
                    }
                }

 

用户控件里定义了委托用于通知主线程该任务是否执行完成

 

        public delegate void ProgressComplete(bool IsComplete);

        public event ProgressComplete Progress_Completed;

 

先在主线程中添加

 

((UserProgressbar)ProgressBarName[ArrayID]).Progress_Completed += new UserProgressbar.ProgressComplete(Auto_Update_Progress_Completed);

 

 

 

然后在委托中启动下一个任务的线程

 

        //委托事件
        void Auto_Update_Progress_Completed(bool IsComplete)
        {
            Mt.WaitOne();

                if (IsComplete)
                {
                    ThreadID = ThreadID - 1;

                    while (ThreadID < Thread_Num && ThreadNow_Num < ProgressArrayLength)
                    {
                        ThreadPool.QueueUserWorkItem(new WaitCallback(((UserProgressbar)ProgressbarPanel.Controls[ThreadNow_Num]).ExecUpdate));

                        ThreadID++;

                        ThreadNow_Num++;
                    }
                }
           
            Mt.ReleaseMutex();
        }

 

说的有点简单,请大家不要见怪。

 

基本上就是这个思路了,如果谁还有更好的思路请回复一下,大家一起讨论讨论。

原创粉丝点击