for i as integer=0 to datatable.rows.count-1
过程(参数1,参数2,参数3)
next
以上这个循环,要执行100多次,执行下来需要20多分钟。能不能用多线程缩短循环执行的时间?可以的话,多线程怎么实现?
------解决思路----------------------
想要使用多线程,请说明你的程序内涵,证明它有“阻塞、等待、循环”的冗余代码,它浪费了CPU资源;以及证明它有逻辑上可并行计算的条件。
只有浪费了CPU资源的程序才值得尝试使用多线程来“缩短”程序整体时间。
------解决思路----------------------
过程(参数1,参数2,参数3) 如果你这个是计算的比较久,而不是那种单一的算法,用多线程会缩短时间,不过你的CPU要多核 的才行。
------解决思路----------------------
感觉你像是在读取数据中的内容。个人看法 :
多用for each,少用for。
你的系统不知道是怎么设计,直接用BeginInvoke去做吧,或许对你的程序有点好处。
------解决思路----------------------
多线程不会节省主线程时间,只是让主线程不停止反应!实际总的消耗时间更长!!!举个实际例子。我开发的一个测量控制程序,每隔10ms接收下位机发来的14个数据。数据经简单处理后要在6个图形界面作图显示和数字显示。原本只设定一个主线程处理,串口接收线程是系统提供,程序中通过委托调用显示数据。实际使用发现有千分之一的数据丢失情况,特别是数据接收过程中当达到一组界限需要重新作图时。我考虑主线程中只是接收和简单处理数据(包括串口接收委托调用),设定另一线程专门处理作图显示。使用BackgroundWorker控件设置线程。最后发现问题是:1. 线程并不稳定。有时运行正常,有时中途停止显示。数据采集还是正常的;2. 数据丢失情况仍然存在,且更严重。程序应该没有问题,使用.BackgroundWorker控件的标准调用,而且只是将之前完全正常的委托调用程序的作图代码放到线程中。反复多次试验均是如此。由此我得到的结论是:设置多线程不能够节省总的消耗时间,而且还存在不稳定隐患!
------解决思路----------------------
可以使用多线程来减少执行时间.
Parallel::For 可以达到效果, 具体的可参考以下链接
https://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for(v=vs.110).aspx
想不通为什么很多人对多线程有意见...
------解决思路----------------------
微软举出的多线程例子之一就是将一个比较花费时间的计算问题作为一个线程在后台运行。另一线程(主线程)处理日常反应。因为计算线程很花费时间,如果放在主线程里会导致主线程无法及时响应其它输入,就像死机。等到计算线程完成计算工作会通知主线程,再由主线程取得计算结果并作出相应处理。这样程序运行流畅,既能及时响应,又不耽搁花费大量时间的计算工作。除非你是认为现在的CPU是多核,可以利用不同的核心在相同时间承担不同的工作。但这不是微软多线程的定义,操作系统或VS未必支持这样的做法?多线程相比单线程肯定存在不稳定性!
------解决思路----------------------
Parallel.For(0,
ThMax,
Sub(StepId)
For I As Integer = StepId To Files.Length - 1 Step ThMax
Dim FInfo As IO.FileInfo = New IO.FileInfo(Files(I))
If Not FInfo Is Nothing AndAlso FInfo.Exists AndAlso _
(IsAllFile OrElse dictExtFilter.ContainsKey(FInfo.Extension)) AndAlso _
getFileAttr(FInfo.Attributes) Then '//过滤文件
Dim CurrFileInfo As New MyFileInfo
With CurrFileInfo
.Name = FInfo.Name
.Extension = FInfo.Extension
.CreationTime = FInfo.CreationTime
.FullName = FInfo.FullName
.Length = FInfo.Length
.DirectoryName = FInfo.DirectoryName
End With
Dim CurrItem As ListViewItem = GetFileItem(CurrFileInfo, NewIconBox)
FileItemBox.Value(FInfo.FullName) = CurrItem
'Interlocked.Add(LoopID, 1)
End If
Next
End Sub)
------解决思路----------------------
我觉得,这个循环如果每次执行的内容没有相互关联的地方,没有共用的累加变量之类的东西的话,是可以按CPU核数来拆分成多线程的,每个线程跑一部分循环内容。