现有一后台程序功能,是读取一些二进制文件,将其中的某一时刻的值取出形成CSV文件
后台程序执行后,新建一个主线程,然后新建40个子线程,子线程读取二进制文件,并存入到一个二维数据中。主线程在新建子线程后用死循环判断各子线程是否全部执行完毕,若执行完毕后,将二维数据中的数据填充形成CSV文件。
主线程代码:
while
dim lstSubThread as new list(of SubThread)for i as integer = 0 to 40
dim subThread as new SubThread(Of SubThreadStart)
subThread.start()
lstSubThread.add(subThread)
next
dim AllEnd as boolean = false
while not allEnd
//判断各子线程是否执行完毕,若执行完毕则将AllEnd 置为 True
end while
end while
子线程代码:
Public Class SubThreaddim blnEnd as boolean = falsepublic sub SubThreadStart
//将数据读取到Stream中。 通过Seek将此时文件的所有值读取一个结构体List中
for i as integer = 0 to LstData.Count -1
//使用循环与 Linq 查询出 需要的数据。存到二维数组中。
nextblnEnd = trueend subEnd Class
现状是在执行到子线程是CPU使用率大概在50%-80%多,在主线程与子线程中也使用了Thread.Sleep(1) 或者 Sleep(10) 的Sleep操作。 可依然CPU使用率很高。
想请问的是
1.对于这个CPU使用率很高,可否还有一些改动呢, 比如读取的数据与分析数据时不使用LINQ,而将数据存储到数据库中是否能将CPU使用率降低?有什么好方法推荐一下。
2.在网上搜索说可能是在线程有死循环,的确主线程待子线程是使用了循环,对于这样的方式,可以有其他的方法可以让主线程可以一直等待子线程执行完毕再执行之后的代码么? 请给点具体的例子。
子线程执行时间看来会随着读取的文件大小有长短的变化,所以执行的时间会较长,也考虑过使用线程池之类的试方式,但是在网上查说,要是使用线程池的话,对于线程的执行时间是有要求的。
欢迎你高手的解答。谢谢!
如果是IO操作的话用这么多线程也是白搭,一样会阻塞.
FileStream.BeginRead()
这是微软提供的方法 用于异步IO