在我的VB.NET程序中,这是一个耗时的函数,可以定期获取数据并更新UI。我将此函数移动到另一个线程,但现在执行需要更长的时间。使用秒表类,我计算出当它是主线程的一部分时,它需要130毫秒,但在单独的线程中需要542毫秒,因此速度慢4倍。
我的CPU是Core I5 M520(2核),所以我现在不知道为什么需要这么长时间。
我正在使用System.Threading.Thread类。我还尝试将新线程的优先级设置得更高,但这没有任何效果。
为什么单独的线程花了这么长时间,有没有办法加快速度呢?
由于
代码:
Public Sub update(ByVal temp As Visual)
SyncLock mUpdateQueue
If Not mUpdateQueue.Contains(temp) Then
mUpdateQueue.Enqueue(temp)
End If
End SyncLock
If Not mainThread.IsAlive Then ' moet hierdie beter doen
mainThread = New Thread(AddressOf DataFetchThread)
mainThread.Start()
End If
End Sub
Private Sub DataFetchThread()
Dim s As New Stopwatch()
s.Start()
Dim temp As Visual = Nothing
While mUpdateQueue.Count > 0
SyncLock mUpdateQueue
temp = mUpdateQueue.Peek()
End SyncLock
mDataCollector.updateV(temp)
SyncLock mUpdateQueue
mUpdateQueue.Dequeue()
End SyncLock
End While
s.Stop()
Debug.WriteLine("thread run time: " & s.ElapsedMilliseconds)
End Sub
mDataCollector.updateV(temp):此函数从数据库获取数据并绘制图片框上的点以创建图形。在这里添加所有代码没有多大意义。
以另一种方式提出这个问题:第二个线程需要花费更长的时间才执行或者我的代码有问题,这是正常的吗?
答案 0 :(得分:1)
您正在从多个线程访问mUpdateQueue
变量,并使用锁定来获取对它的访问权限。这很好,但使用锁有一个开销(获取锁,并在其他线程等待获取锁的时间)。这可能是你的新线程需要更长时间的原因:它正在等待锁定。
您可以尝试使用ReaderWriterLockSlim
类,它可以更快地访问您的变量。请记住它实现了IDisposable
,因此您需要在完成后调用Dispose
。