c#多线程 task的使用

limenglandon 2014-10-19 02:52:46
问题是这样的,有大概10W个账号,每个账号的数据处理需要几十秒,如果串行处理的话,肯定要花几个小时,死定了。所以想改成多线程,请假了几个高级软件工程师,他们说最好用task,可以创建50个atsk。我是刚到这个公司,以前是做c++转做c#的,对task不熟悉。那么问题来了,请教各位大牛,就创建50个task,对我的程序改造下呢,最好把代码写下,万分感激啊。

我目前的程序:
main()
{
。。。
for(int i = 0;i<100000;i++)
{
func(i);--------------------------------------》怎么弄50个task实现,并且不要阻塞主线程???????
}
messbox.show("10W个任务完成")
。。。
}

写写,如果可以的话,帮我写段代码出来,。
...全文
16499 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010750886 2015-10-05
  • 打赏
  • 举报
回复
task是建立线程池基础之上的, 看懂线程池的作业原理。
就知道怎么用任务并行库了,task,plinq都属于任务并行库。
那城 2015-06-12
  • 打赏
  • 举报
回复
Task<Int32> t = new Task<Int32>(n => Sum((Int32)n), 1000000000); // 可以在以后某个时间启动任务 t.Start(); // ContinueWith 返回一个 Task,但一般都不再关心这个对象 Task cwt = t.ContinueWith(task => Console.WriteLine("The sum is: " + task.Result))
smthgdin_020 2015-06-12
  • 打赏
  • 举报
回复
引用 5 楼 github_22161131 的回复:
50个task其实没有任何意义,你会发现用更小的数字也是同样的结果。简单点的方式可以用上面说的PLINQ,其实底层就是task,不过要注意并发度写50不表示就是50个线程,50个task同样不表示50个线程。最终使用几个线程,是使用线程池还是新开线程是TaskScheduler控制的。 如果你对数据的处理是大量的计算,也就是计算密集的,那并发最多用CPU核心数,再多并发CPU一样处理不过来。这种如果想快就只能用多台机器了(或者优化处理算法)。 如果大量的时间是等待IO操作,比如将账号数据提交到其它的系统去,再等待结果这种IO密集的,用50也没有意义。不是说你用50个task就是同时50个请求。这种必须使用异步IO调用才有意义(其实如果完全IO密集型,一个线程就够了)。 关于PLINQ和task的关系,请看官方文档 http://msdn.microsoft.com/en-us/library/dd460693(v=vs.110).aspx,PLINQ的实现就是依赖于TPL的,最终由TPL操作线程
这个回答最完整最透彻。:)
我叫小菜菜 2015-06-12
  • 打赏
  • 举报
回复
引用 9 楼 iyomumx 的回复:
把for语句改为Parallel.For调用就可以了:
//for(int i = 0;i<100000;i++) 改为
Parallel.For(0, 100000, i =>
其他的不用改,你的func(i)就并行执行了,具体并行度有系统调度,会综合考虑任务复杂度和系统压力,不用你操心
还是这个比较适合初级往中级发展的娃。net本身就有一个简单的并行编程库。
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
晕死!这种东西在 PLinq 中就是一句话而已。假设你的处理数据写到一个 source 变量引用的对象集合中,你的函数方法 Proc输入是一个待处理对象,输出是一个结果对象,那么可以写(
var result = from x in source.AsParallel().WithDegreeOfParallelism(50)
                select proc(x);
这就得到了并发50线程处理结果啊!
没用过这个 比如10000条数据 你这生成的50个处理对象是每个对象处理200条还是 50个对象每个对象都处理10000条
limeng12319 2015-06-11
  • 打赏
  • 举报
回复
Parallel.ForEach(entity.OpenId, openid => { Task<string> ( 对外 发送请求 且 等待 回来的消息) }); 我是给微信发几十万次 请求 为什么发到一万不到 就 报AggregateException 错误 捕获异常也不行
qqshenyunzcz 2014-12-25
  • 打赏
  • 举报
回复
引用 16 楼 yuwenge 的回复:
一个觉得多线程或者并行计算就能解决“速度慢”的程序员,那肯定是培训学校教出来的。
大师,请问你是 哪个野鸡大学出来的?
qqshenyunzcz 2014-12-25
  • 打赏
  • 举报
回复
引用 15 楼 chb345536638 的回复:
还在用2008没这货
大师,请问你是 哪个野鸡大学出来的?
  • 打赏
  • 举报
回复
还在用2008没这货
x1983c 2014-10-24
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
晕死!这种东西在 PLinq 中就是一句话而已。假设你的处理数据写到一个 source 变量引用的对象集合中,你的函数方法 Proc输入是一个待处理对象,输出是一个结果对象,那么可以写(
var result = from x in source.AsParallel().WithDegreeOfParallelism(50)
                select proc(x);
这就得到了并发50线程处理结果啊!
正解!
卧_槽 2014-10-24
  • 打赏
  • 举报
回复
一个觉得多线程或者并行计算就能解决“速度慢”的程序员,那肯定是培训学校教出来的。
  • 打赏
  • 举报
回复
PLINQ 早在 2010年我们就研究得很多了。至于类似的东西,更可以追溯到很早。不过这都是不说的“时髦儿词儿”的意思。 同样是对某些人觉得新鲜的东西,如果你已经研究过很多年(只不过微软没有做出来而已),那么你可以立刻就推荐使用;而如果是真的毫无研究的,应该先放一段时间看看这个东西出来的之前的10年间别人是否早就在微软之前用了更好的方案。
iyomumx 2014-10-20
  • 打赏
  • 举报
回复
引用 4 楼 GoingNaive 的回复:
PLINQ难道不是.NET 4才有的“时髦货”吗
说得好像Task不是.Net 4才有的“时髦货”
  • 打赏
  • 举报
回复
引用 4 楼 GoingNaive 的回复:
PLINQ难道不是.NET 4才有的“时髦货”吗
其实“时髦词儿”的意思,是指一个人捡了一个东西以后觉得很时髦,跟时间新旧无很大关系。比如说有个老农捡了城里女人往乳房上涂的膏,回去当作擦脸油使,结果发现脸肿了。这就是捡拾髦儿了。它也不一定会捡到不好的东西,但是它说明了一种心态,而已。
iyomumx 2014-10-20
  • 打赏
  • 举报
回复
把for语句改为Parallel.For调用就可以了:
//for(int i = 0;i<100000;i++) 改为
Parallel.For(0, 100000, i =>
其他的不用改,你的func(i)就并行执行了,具体并行度有系统调度,会综合考虑任务复杂度和系统压力,不用你操心
於黾 2014-10-20
  • 打赏
  • 举报
回复
所谓task,其实就是对线程的一种封装嘛 你直接创建50个线程,不是一回事吗 你先想明白到底要干什么,不要为了task而task
  • 打赏
  • 举报
回复
引用 5 楼 github_22161131 的回复:
50个task其实没有任何意义,你会发现用更小的数字也是同样的结果。
50是用户定义的“上限”,并不保证正好50个任务。 设置多少更好,我相信 lz 会有一个测试的。
  • 打赏
  • 举报
回复
而且它(开发同一个解决方案) --> 而且其他人(开发同一个解决方案) 基于时间的新旧来做判断,这是毫无头脑的,缺乏分析的。我们当然应该学习最新的版本和功能。而纠结在这个“时间”上面,就根本没有好懒标准了。
  • 打赏
  • 举报
回复
引用 4 楼 GoingNaive 的回复:
PLINQ难道不是.NET 4才有的“时髦货”吗
那你就写 Task 呗。 如果你把“时髦货”仅仅看成了时间的新旧,那么对不起你完全没有懂我关于“时髦名词儿”的意思。 比如说我总是在出了 vs2013 的时候使用 vs2013,而且它(开发同一个解决方案)则使用 vs2012 和vs2010,我追的时功能,而不是时髦。如果你看不到功能和简洁,而把时间更新就叫做时髦,这是可悲的和幼稚的。
winnowc 2014-10-19
  • 打赏
  • 举报
回复
50个task其实没有任何意义,你会发现用更小的数字也是同样的结果。简单点的方式可以用上面说的PLINQ,其实底层就是task,不过要注意并发度写50不表示就是50个线程,50个task同样不表示50个线程。最终使用几个线程,是使用线程池还是新开线程是TaskScheduler控制的。 如果你对数据的处理是大量的计算,也就是计算密集的,那并发最多用CPU核心数,再多并发CPU一样处理不过来。这种如果想快就只能用多台机器了(或者优化处理算法)。 如果大量的时间是等待IO操作,比如将账号数据提交到其它的系统去,再等待结果这种IO密集的,用50也没有意义。不是说你用50个task就是同时50个请求。这种必须使用异步IO调用才有意义(其实如果完全IO密集型,一个线程就够了)。 关于PLINQ和task的关系,请看官方文档 http://msdn.microsoft.com/en-us/library/dd460693(v=vs.110).aspx,PLINQ的实现就是依赖于TPL的,最终由TPL操作线程
加载更多回复(4)

110,534

社区成员

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

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

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