0

基本上我有一个全局变量,例如...

Dim int1 as integer

然后我有两个异步函数,比如......

function bleh()
    int1 += 1
end function

function Meh()
     int1 -= 1
end function

这两个函数都由 Task.Run() 运行。

我想在这两个函数中使用 SyncLock。但是,MSDN 站点上给出的所有示例仅显示了在单个函数中使用 SyncLock 的示例。因此,我不能简单地从 MSDN 描述中判断我是否可以在全局变量上跨两个不同的函数使用 SyncLock。

我想做的是这样的:

Private Shared SyncObj as Object '<-- global
Dim int1 as integer '<-- global

Sub Form_Load(...)
     SyncObj = new Object
     Task.Run(Function() bleh())
     Task.Run(Function() Meh())
End Sub

Function bleh()
     SyncLock SyncObj
        int1 += 1
     End SyncLock
End Function
Function Meh()
     SyncLock SyncObj
        int1 -= 1
     End SyncLock
End Function

这样做可以吗?bleh() 会阻止 Meh() 更改 int1,反之亦然?谢谢!对不起VB大声笑。

4

1 回答 1

5

是的,没关系。SyncLock是为此而设计的。它避免了其他线程在其他线程正在使用它时访问资源。我建议您使用 Console.Writeline 或 Debug.Writeline 来跟踪其输出。

添加一个 While true 来检查值是如何变化的:

Sub Form_Load(...)
     SyncObj = new Object
     While true
      Task.Run(Function() bleh())
      Task.Run(Function() Meh())
     End while     
End Sub

Function bleh()
     SyncLock SyncObj
        int1 += 1
        Debug.Writeline("from thread bleh: " & int1.toString)
     End SyncLock
End Function
Function Meh()
     SyncLock SyncObj
        int1 -= 1
         Debug.Writeline("from thread meh: " & int1.toString)
     End SyncLock
End Function

Synclock将阻止bleh () 在 meh() 使用它时访问该代码,反之亦然。

编辑:我执行了你的代码,这是输出:

从线程meh:-1

从线程meh:-2

从线程bleh:-1

从线程bleh:0

从线程bleh:1

从线程meh:0

从线程bleh:1

从线程meh:0

从线程bleh:1

从线程meh:0

从线程meh:-1

从线程bleh:0

从线程bleh:1

从线程meh:0

从线程bleh:1

来自线程bleh:2

从线程meh:1

从线程meh:0

从线程meh:-1

从线程bleh:0

您阻止了对int1的访问,但是您无法控制一个线程在另一个线程被触发之前执行两次,如您所见。

这可能对使用另一个示例很有用,例如使用 File,它不能同时从两个线程访问,否则会给出异常。

这里有一个例子:

 Imports System.Threading.Tasks
Imports System.IO

Module Module2

    Dim SyncObj As Object

    Dim path As String = "c:\testfile.text"
    Sub Main()

        SyncObj = New Object
        While True
            Task.Factory.StartNew(Function() bleh())
            Task.Factory.StartNew(Function() Meh())
        End While
    End Sub

    Function bleh()
        SyncLock SyncObj

            Using sw As New StreamWriter(path, True)
                sw.WriteLine("From bleh!!!")
            End Using
        End SyncLock
    End Function
    Function Meh()
        SyncLock SyncObj
            Using sw As New StreamWriter(path, True)
                sw.WriteLine("From meh!!!")
            End Using
        End SyncLock
    End Function

End Module

这个例子在几秒钟内没有任何异常地在路径文件上写入了26814 行,因此对资源的并发访问没有发生。

于 2013-10-17T09:02:52.630 回答