这应该是线程安全的,对吗?可能有更好的方法吗?
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
在我的应用程序中,我在lastInputTicks
事件中使用方法SetLastInputTime
设置PreFilterMessage
值。在其他一些Threads
我必须检查这个变量。我通过致电GetIdleTime
来做到这一点,但现在我不确定,这是否是线程安全的,或者我可能遇到麻烦。
提前谢谢!
答案 0 :(得分:1)
您的解决方案看起来没问题。 Interlocked
涵盖对相关变量的所有访问权限,因此访问权限正常,您的GetIdleTime
函数中不会收到任何已损坏的值。
您唯一应该注意的是,您可能会收到GetIdleTime
函数中的旧值,因为未完成与新值的交换。因此,如果SetLastInputTime
和GetIdleTime
同时或多或少地被调用,GetIdleTime
函数可能会也可能不会显示更新的时间。
在任何情况下,我都认为没有办法让它比这更好。重叠的呼叫问题是你永远不会摆脱的。这就是多线程的本质。