C#多线程控制线程数执行

嬗变 2014-12-10 03:57:36
这是之前我提的一个问题没有解决,现在我把完整代码发出来,求高手解决。
要求:datagridview里面,第一列数据加上第二列数据,然后把结果返回到第三列,用10个线程处理。
下面是界面:


后面是代码,求补齐:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace 多线程练习
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
DataTable dt;
int i=0;
private void Form1_Load(object sender, EventArgs e)
{
dt = new DataTable("mytable");
dt.Columns.Add("num1",typeof(Int32));
dt.Columns.Add("num2",typeof(Int32));
dt.Columns.Add("co", typeof(Int32));
DataRow crow;
for (int n = 1; n <=1000;n++ )
{
crow = dt.NewRow();
crow["num1"] = n;
crow["num2"] = n + 1;
crow["co"] = 0;
dt.Rows.Add(crow);
}
dataGridView1.DataSource = dt;
}
private void button1_Click(object sender, EventArgs e)
{
Thread threads;
for (int t = 0; t < 10;t++)
{
threads = new Thread(new ThreadStart(Dodail));
threads.IsBackground = true;
threads.Name=t.ToString()+"号线程";
threads.Start();
}
}

private void Dodail()
{
while(i<1000)
{

}
}
}
}
...全文
306 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
嬗变 2014-12-10
  • 打赏
  • 举报
回复
恩,谢谢大家的回答,我已经明白了,之前太过于纠结使不使用线程池。只是如果自己管理队列我不太懂,如果有人在这里给分享一下那就更好了,另外,我之前有听人说过,可以用一个全局变量做为处理数据的下标,然后通过在线程里面变量把全局变量赋值给他,并标注已经完成的任务,这样也可以实现,其实我上面的例子就想做的是这点,可惜我写在那卡住了。
嬗变 2014-12-10
  • 打赏
  • 举报
回复
引用 6 楼 nongfuxu 的回复:
引用
这是之前我提的一个问题没有解决,现在我把完整代码发出来,求高手解决。 要求:datagridview里面,第一列数据加上第二列数据,然后把结果返回到第三列,用10个线程处理。 下面是界面:
LZ你写的内容不是说是要“求第一列与第二列的加法,结果存放到第三列”嘛? 这个加法要用10个线程来做? 不明白LZ想表达什么。
我想表达的是:这里也许是求第一列与第二列的加法,结果存放到第三列”,可以不用线程。但是,假如有1000条URL,我要去抓取里面内容,并且分析处理,我想用10个线程来做,而不是用1000个线程,我之前有试过,发现当线程开的太多时候,效率就会下降,连接数会剧增,所以我希望能控制线程个数,同时做到不重复执行,就是一个线程去领任务时,只去做还没有完成的任务,而不会做已经完成的任务。
於黾 2014-12-10
  • 打赏
  • 举报
回复
线程池本身就有队列,不需要你自己再维护队列 当然你要是时分抵制使用线程池,用4楼我说的办法,自己维护一个队列也可
於黾 2014-12-10
  • 打赏
  • 举报
回复
引用 7 楼 wangmurata 的回复:
@Z65443344 我之前也想过线程池,但是我在网上查了一下,线程池主要是处理耗时比较短的线程,这里可能是耗时比较短,但是如果我是抓取网页的话,那就不一样了。而且如果我中用10个或者几个线程的话,用线程池效率不高,所以我才想用这种方式去做。
是谁告诉你线程池只能处理耗时较短的任务,而且效率不高的? 只是说,如果耗时较短并且很频繁的开启结束线程,那么使用线程池会比你自己去处理开启新线程效率更高,而不是说耗时长的任务它不行
嬗变 2014-12-10
  • 打赏
  • 举报
回复
@Z65443344 我之前也想过线程池,但是我在网上查了一下,线程池主要是处理耗时比较短的线程,这里可能是耗时比较短,但是如果我是抓取网页的话,那就不一样了。而且如果我中用10个或者几个线程的话,用线程池效率不高,所以我才想用这种方式去做。
nongfuxu 2014-12-10
  • 打赏
  • 举报
回复
引用
这是之前我提的一个问题没有解决,现在我把完整代码发出来,求高手解决。 要求:datagridview里面,第一列数据加上第二列数据,然后把结果返回到第三列,用10个线程处理。 下面是界面:
LZ你写的内容不是说是要“求第一列与第二列的加法,结果存放到第三列”嘛? 这个加法要用10个线程来做? 不明白LZ想表达什么。
嬗变 2014-12-10
  • 打赏
  • 举报
回复
@Z65443344 我这个例子的主要目的不是说访问数据库,主要目的是如果控制多线程处理数据,且能保证不重复执行。这里面有1000个只是一个样例,可能不是1000,更多或者更少。
於黾 2014-12-10
  • 打赏
  • 举报
回复
你可以用线程池,或者自己定义10个线程,把任务放队列里,然后线程去队列里取任务出来执行
於黾 2014-12-10
  • 打赏
  • 举报
回复
你在数据库查询的时候 直接select a,b,(a+b) as c from table不好吗
嬗变 2014-12-10
  • 打赏
  • 举报
回复
回复:bdmh 本来主是目的是用多线程抓取网页,结果发现,如果不限止线程个数,就会出现网络连接被耗尽,所以我想限制线程个数,但是这样一来,比如我这里面1000个任务,要用10个线程来做,怎么保证这个线程不会去做已经做过的任务。
bdmh 2014-12-10
  • 打赏
  • 举报
回复
想表达什么啊

110,538

社区成员

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

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

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