初学C#,现有 多线程处理数据问题: 有1000条记录,每条记录都要这样处理:读取,分析,保存结果 20
6个回答
展开全部
额,对于你的问题我只能这么说,使用多线程不但不会提升处理速度,而且会降低数据处理速度!记住,是一定会降低处理速度!
你要明白多线程的作用是异步处理,而不是提高速度(哪怕你的cpu是一万核的也白搭,那只能说明你电脑的处理性能很高),因为所谓多线程其实是“伪线程”,创建越多的线程,则会越多的分散资源和占用资源。所以使用线程只是为了你在后台处理这1000条数据的时候,你的程序还能正常运行,而不会“卡死”。
那么,你就只需要创建一个线程就可以了。另外,你所说的“每条记录都要读取”,一定不能循环1000次来读取,循环连续访问数据库是编程的大忌。一次性读取,然后在程序里循环分析,最后将分析结果统一的一次性保存数据。
你要明白多线程的作用是异步处理,而不是提高速度(哪怕你的cpu是一万核的也白搭,那只能说明你电脑的处理性能很高),因为所谓多线程其实是“伪线程”,创建越多的线程,则会越多的分散资源和占用资源。所以使用线程只是为了你在后台处理这1000条数据的时候,你的程序还能正常运行,而不会“卡死”。
那么,你就只需要创建一个线程就可以了。另外,你所说的“每条记录都要读取”,一定不能循环1000次来读取,循环连续访问数据库是编程的大忌。一次性读取,然后在程序里循环分析,最后将分析结果统一的一次性保存数据。
更多追问追答
追问
线程不需要创建很多吧?我的想法是:读取,分析,保存分别写成线程A,B,C
A读取第一条后,交给B来分析,然后A继续读取下一条,B分析完成后交C来保存,B再分析下一条A已经读取好的记录,同样,C保存完一条记录后接着保存下一条已经分析好的记录。
这样不知道能不能实现??
追答
实现是可以实现的,但是只会增加你程序的复杂程度,而且不见得有你预期的理想结果。
你如果要实现的话,我这有两种思路(未写代码实验,只是思路):
第一种,需要有一个数据容器和全局变量,因为你的线程函数是不能相互调用的,所以要用一个全局变量记录是否A读取完毕,线程B会在变量显示A结束之前,一直不断的从容器内取数据分析(分析过的删除或标记,你自己定。)。同样,C针对与B的操作同上。
第二种,再加一个监视线程,这其实有悖于三个线程了,只不过是处理数据的是三个线程。监视线程的作用就是监视A,B的处理进度同而控制B,C的开始和暂停。
以上只是处理思路。不过说实话,这两种方式,我自己都觉得不可取,如果是为了研究问题,可以实验一下,看看效果,不过做为应用程序,还是不建议的,因为线程的异步性,所以比较不容易控制,而且,如之前说的,会增加你程序的复杂程度,而且不见得有你预期的理想结果。
展开全部
把1000条数据分成5组,每组200条数据,然后设置5条线程同时执行这5组数据即可。如果每条记录的处理涉及到数据库或者文件系统,还需要加锁。关于怎么写多线程,去网上找一下".NET异步",会有大把的资料。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用多线程和不使用多线程的方法下面都有回答了,我就不重复了!如果每条记录的处理结果不需要汇总到一起,使用多线程实现起来也不复杂,可以按照下面回答的方式进行分组处理,处理完成一条记录就写入到数据库(写入数据库时,最好是批量写入,这样能提高数据库的操作性能)。
如果所有记录处理完成后需要汇总的话,则需要注意标识记录线程的总数,每个线程处理的状态等管理。
至于两种方式的实际处理性能,自己测试吧!这个真没有测试过。
如果所有记录处理完成后需要汇总的话,则需要注意标识记录线程的总数,每个线程处理的状态等管理。
至于两种方式的实际处理性能,自己测试吧!这个真没有测试过。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用线程技术可以帮你解决UI卡死的现象,但不能解决性能带来的问题,反而会使性能更加繁重。
多线程后线程间需要传输数据,这个需要通过委托来执行,而委托会占用资源,如果委托越多占用的资源就越多
多线程技术可以提高用户体验
多线程后线程间需要传输数据,这个需要通过委托来执行,而委托会占用资源,如果委托越多占用的资源就越多
多线程技术可以提高用户体验
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
多线程提高不了你的执行速度,除非你是多核的Cpu。
顺便问一句,你这1000条记录,需要在同一个事务里处理么?
顺便问一句,你这1000条记录,需要在同一个事务里处理么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询