如何控制线程个数,直到一个线程完毕后才启动另一个线程

phuai007 2014-08-11 02:40:44
如题,我采集漫画站图片回本地,多线程操作,如何才能控制住几个线程慢慢采集呢?

比如说我想控制5个线程同时采集1-5部漫画,无论某个线程采集完成后,就关闭自身,然后主线程才另开线程继续采集第6部,第7部漫画,请问如何操作,呢,在网上找到一些方法不会用,下面是我的代码思路,希望大神帮忙指点下


//定义全局变量
static Semaphore semaphore = new Semaphore(3, 3); //线程数

private void button1_Click(object sender, EventArgs e)
{
for (Int32 i = 1; i <= 5791; i++)//一共有这么多部漫画
{
semaphore.WaitOne();
mu = i.ToString();//将目录设置为全局变量
Thread thread = new Thread(() => get_url(http + "/comic/" + i + "/"));
thread.Start();
Delay(T_time);//5秒启动一个线程
semaphore.Release();
}
}

//获得每一话的地址
private void get_url(String url)//内容列表页地址url格式为http://m.imanhua.com/comic/201/
{

String html = getHtml(url);//得到源码
if (html == "err")
{
//MessageBox.Show("错误:目标地址无法打开", "错误");
return;
}
else
{
String list = regur1(html, reg1);
list = regur2(list, reg2);
if (list != "err")
{
String[] list_arr = list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);//集合转为数组
Int32 a = 0;
foreach (String k in list_arr)
{
Get_pic(k, mu + "\\" + (list_arr.Count() - a).ToString()); ///comic/150/list_40827.html#170 m=150 漫画id
a++;
}
}
semaphore.Release();
//这一篇漫画采集完成,关掉当前线程,开启一个新线程
//这一篇漫画采集完成,关掉当前线程,开启一个新线程

}
}

//搞图片
private void Get_pic(String list_url, String mu_path)
{
// String [] s = list_url.Split(new char[]{'#'});
// String url = s[0];
// String url2 = s[1];
String p = upload + mu_path; //保存目录地址
if (makefile(p) == false)//创建文件夹
{
MessageBox.Show("无法创建文件夹,可能的原因有:\n没有磁盘写入权限\n要创建的目录错误\n路径:" + p + "");
return;
}

String html = getHtml(http + list_url);
if (html == "err")
{
MessageBox.Show("错误:目标地址无法打开", "错误");
return;
}
else
{
String pic = regur1(html, reg4);
String[] pic_arr = pic.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
Int32 i = 1;
String pic_up_path=String.Empty;
foreach (String k in pic_arr)
{
Save_img(weburl + k, http + list_url, p + "\\" + i + ".png");//保存图片到指定路径
i++;
}
//这一话采集完

}
}
/////公用方法
......

...全文
448 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-08-11
  • 打赏
  • 举报
回复
参考下载软件是怎么干的? 1.把任务丢到队列里 2.根据需要,开N个线程 3.每个线程去队列里取一个任务,并开始执行(当然已经执行的要移出队列或设置标记,防止多个线程去取同一个任务,而且要加锁) 4.处理完之后,不要退出,去取下一个任务 5.队列里已经没有任务,线程退出
tcmakebest 2014-08-11
  • 打赏
  • 举报
回复
为什么要用控制线程数的概念呢,建几个线程就是几个,让这些线程不断执行任务就行了,等没有任务再退出线程达到关闭的目的.
mlqxj35674 2014-08-11
  • 打赏
  • 举报
回复
建立一个数组thread[100],能不能控制线程个数
Cnwanglin 2014-08-11
  • 打赏
  • 举报
回复
线程不用另开阿 比如, thread_1(get_cartoon(ct1)); 比如, thread_2(get_cartoon(ct2)); 比如, thread_3(get_cartoon(ct3)); 比如, thread_4(get_cartoon(ct4)); 比如, thread_5(get_cartoon(ct5)); ct1完成了 比如, thread_1(get_cartoon(ct6)); ... 不就OK了
Cnwanglin 2014-08-11
  • 打赏
  • 举报
回复
。。。是500个资源。。。让5个线程来干不行吗?
  • 打赏
  • 举报
回复
丢个线程池,最大线程数是5 然后你就啥也不用管了,啪啪啪方法里丢参数,等他啪啪啪完就是了

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧