【缺点】:每个线程分配到的任务可能不等,比如20个任务,分配给3个线程,第一个、第二个线程都是处理6个任务,但是第三个线程处理了剩下的8个任务,比前2个线程多出了2个任务。这就造成了第三个线程完成的时间明显比前2个长,拖慢了整个任务的完成时间。
增加一个定时器,定时器动态的监控当前有多少个线程,当少于设定的线程时自动增加线程来处理。此种情况下,每个线程只处理一个任务。可以保证始终有设定数量的线程在处理任务。并不会出现最后一个线程拖慢整个任务完成的时间。
//全局变量
System.Timers.Timer thread_timer = new System.Timers.Timer(1000); //实例化Timer类
private static object lockobj = new object(); //线程锁
int threadnum = 1; //总线程数
int threadnumnow = 0; //在用线程数
int rowstotal = 1; //总任务数
int currentrow = 0; //当前任务
private void button1_Click(object sender, EventArgs e)
{//多线程 开始任务
threadnum = 3; //总线程数
threadnumnow = 0;
rowstotal = 20 //总任务数
currentrow = 0;
//启动线程检查定时器
thread_timer .Elapsed += new System.Timers.ElapsedEventHandler(thread_timer_Elapsed);
thread_timer.AutoReset = true;
thread_timer.Enabled = true;
}
void thread_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{//线程检查器
if (currentrow >= rowstotal)
{
thread_timer.Enabled = false;
}
else
{
if (threadnumnow < threadnum)
{
Thread newThread = new Thread(new ParameterizedThreadStart(createThread_test));
newThread.IsBackground = true;
newThread.Start(currentrow); //传参
lock (lockobj) { currentrow++; threadnumnow++; }
}
}
}
private void createThread_test(object p)
{//测试线程
int rx = Convert.ToInt32(p); //当前行索引
dataGridView1.Rows[rx].Cells[7].Value = rx + 1;
Thread.Sleep(4000);
dataGridView1.Rows[rx].Cells[7].Value = "ok";
lock (lockobj) { threadnumnow--; }
}