今天刚刚把自动更新程序写完,说下多线程执行多任务的思路。
如果有错误请大家指证!
我的这个程序是可以自己设定线程数目的,点击按钮执行多线程任务。
下面开始
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();
}
说的有点简单,请大家不要见怪。
基本上就是这个思路了,如果谁还有更好的思路请回复一下,大家一起讨论讨论。