应用空闲 - 这是线程安全的吗?

时间:2015-09-30 12:18:18

标签: .net vb.net thread-safety

这应该是线程安全的,对吗?可能有更好的方法吗?

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来做到这一点,但现在我不确定,这是否是线程安全的,或者我可能遇到麻烦。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您的解决方案看起来没问题。 Interlocked涵盖对相关变量的所有访问权限,因此访问权限正常,您的GetIdleTime函数中不会收到任何已损坏的值。

您唯一应该注意的是,您可能会收到GetIdleTime函数中的值,因为未完成与新值的交换。因此,如果SetLastInputTimeGetIdleTime同时或多或少地被调用,GetIdleTime函数可能会也可能不会显示更新的时间。

在任何情况下,我都认为没有办法让它比这更好。重叠的呼叫问题是你永远不会摆脱的。这就是多线程的本质。