VB.Net Tutorial/Thread/SyncLock — различия между версиями

Материал из VB Эксперт
Перейти к: навигация, поиск
м (1 версия)
 
(нет различий)

Текущая версия на 15:56, 26 мая 2010

Producer and consumer with SyncLock

<source lang="vbnet">Imports System.Threading Module Module1

   Public Buffer As Integer
   Public BufferEmpty As Boolean = True
   Public ProducerConsumerLock As Object = New Object()
   Sub Producer()
       Dim Value As Integer = 0
       Do
           SyncLock ProducerConsumerLock
               If (BufferEmpty) Then
                   BufferEmpty = False
                   Buffer = Value
                   If (Value = 0) Then
                       Value = 1
                   Else
                       Value = 0
                   End If
                   Console.WriteLine("Producer: " & Buffer)
               End If
           End SyncLock
       Loop While (True)
   End Sub
   Sub Consumer()
       Dim Value As Integer
       Do
           SyncLock ProducerConsumerLock
               If (Not BufferEmpty) Then
                   BufferEmpty = True
                   Thread.CurrentThread.Sleep(1000)
                   Value = Buffer
                   Console.WriteLine("Consumer: " & Value)
               End If
           End SyncLock
       Loop While (True)
   End Sub
   Sub Main()
       Dim ProducerThread As Thread = New Thread(AddressOf Producer)
       Dim ConsumerThread As Thread = New Thread(AddressOf Consumer)
       ProducerThread.Start()
       ConsumerThread.Start()
   End Sub

End Module</source>

Producer: 0
Consumer: 0
Producer: 1
^CTerminate batch job (Y/N)? n

SyncLock

<source lang="vbnet">Imports System.Threading public class Test

  Shared Dim obj As New someClass()
  public Shared Sub Main
              Dim thread1 As New Thread(AddressOf method1)
              Dim thread2 As New Thread(AddressOf method2)
              thread1.Start()
              thread2.Start()
  End Sub
      Private Shared Sub method1()
              SyncLock (obj)
                      Dim i As Integer
                      For i = 0 To 5
                              obj.someData += i
                              Console.WriteLine(obj.someData)
                      Next
              End SyncLock
      End Sub
      Private Shared Sub method2()
              SyncLock (obj)
                      Dim i As Integer
                      For i = 0 To 5
                              obj.someData += i
                              Console.WriteLine(obj.someData)
                      Next
              End SyncLock
      End Sub
  

End class

Public Class someClass

      Public Shared someData As Integer

End Class</source>

0
1
3
6
10
15
15
16
18
21
25
30

Use SyncLock for shared resources

<source lang="vbnet">Imports System.Threading Public Class Tester

   Shared WithEvents oSquare As SquareClass = New SquareClass()
   Public Shared Sub Main
       
       Dim t As Thread
       t = New Thread(AddressOf oSquare.CalcSquare)
       oSquare.Value = 3
       t.Start()
   
   End Sub
   Shared Sub SquareEventHandler(ByVal Square As Double) Handles oSquare.ThreadComplete
       Console.WriteLine(Square)
   End Sub

End Class Public Class SquareClass

   Public Value As Double
   Public Square As Double
   Public Event ThreadComplete(ByVal Square As Double)
   Public Sub CalcSquare()
       Square = Value * Value
       RaiseEvent ThreadComplete(Square)
   End Sub
   Public Sub SyncCalcSquare()
       SyncLock GetType(SquareClass)
           Square = Value * Value
           MsgBox(Square)
       End SyncLock
   End Sub

End Class</source>

9