2015-09-30 57 views
1

這應該是線程安全的,對嗎?有沒有更好的方法?應用程序空閒 - 這是線程安全的嗎?

Imports System.Threading 

Public Class ApplicationIdleHelper 
    Private Shared lastInputTicks As Long 

    Public Shared Sub SetLastInputTime(dt As DateTime) 
     Interlocked.Exchange(lastInputTicks, dt.Ticks) 
    End Sub 

    Public Shared Function GetIdleTime() As Integer 
     Return (Now - New DateTime(Interlocked.Read(lastInputTicks))).TotalSeconds 
    End Function 
End Class 

在我的應用我有在PreFilterMessage事件的方法SetLastInputTime設置lastInputTicks值。在其他一些Threads我必須檢查這個變量。我通過調用GetIdleTime來做到這一點,但現在我不確定,如果這是線程安全的,或者我可能遇到麻煩。

預先感謝您!

回答

1

您的解決方案看起來沒問題。對所涉及的變量的所有訪問都由Interlocked覆蓋,因此訪問應該沒問題,並且您的GetIdleTime函數中沒有收到任何損壞的值。

您應該意識到的唯一一件事情是您可能會收到來自GetIdleTime函數的舊的值,因爲與新值的交換沒有完成。因此,如果SetLastInputTimeGetIdleTime或多或少同時被調用,那麼GetIdleTime函數可能會顯示或不顯示更新的時間。

無論如何,我不認爲有辦法讓它做得比這更好。重疊呼叫問題是你永遠不會擺脫的。這就是多線程的本質。