代码在.net中的单独线程上执行需要更长的时间

时间:2011-10-31 09:22:47

标签: vb.net multithreading

在我的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):此函数从数据库获取数据并绘制图片框上的点以创建图形。在这里添加所有代码没有多大意义。

以另一种方式提出这个问题:第二个线程需要花费更长的时间才执行或者我的代码有问题,这是正常的吗?

1 个答案:

答案 0 :(得分:1)

您正在从多个线程访问mUpdateQueue变量,并使用锁定来获取对它的访问权限。这很好,但使用锁有一个开销(获取锁,并在其他线程等待获取锁的时间)。这可能是你的新线程需要更长时间的原因:它正在等待锁定。

您可以尝试使用ReaderWriterLockSlim类,它可以更快地访问您的变量。请记住它实现了IDisposable,因此您需要在完成后调用Dispose