SyncLock-AnweisungSyncLock Statement

Ruft eine exklusive Sperre für einen Anweisungsblock vor der Ausführung des Blocks ab.Acquires an exclusive lock for a statement block before executing the block.

SyntaxSyntax

SyncLock lockobject  
    [ block ]  
End SyncLock  

TeileParts

lockobject
Erforderlich.Required. Ein Ausdruck, einen Objektverweis ausgewertet wird.Expression that evaluates to an object reference.

block
Dies ist optional.Optional. Der Block von Anweisungen, die ausgeführt werden, wenn die Sperre abgerufen wurde.Block of statements that are to execute when the lock is acquired.

End SyncLock
Beendet eine SyncLock Block.Terminates a SyncLock block.

HinweiseRemarks

Die SyncLock Anweisung wird sichergestellt, dass den Anweisungsblock nicht von mehreren Threads gleichzeitig ausgeführt wird.The SyncLock statement ensures that multiple threads do not execute the statement block at the same time. SyncLock verhindert, dass jeder Thread den Block eingeben, bis kein anderer Thread sie ausgeführt wird.SyncLock prevents each thread from entering the block until no other thread is executing it.

Die häufigste Verwendung von SyncLock zum Schutz von Daten aus, die gleichzeitig von mehreren Threads aktualisiert wird.The most common use of SyncLock is to protect data from being updated by more than one thread simultaneously. Wenn die Anweisungen, die die Daten bearbeiten können bis zum Abschluss ohne Unterbrechung wechseln müssen, platzieren Sie sie in einem SyncLock Block.If the statements that manipulate the data must go to completion without interruption, put them inside a SyncLock block.

Ein Anweisungsblock, die durch eine exklusive Sperre geschützt wird auch als bezeichnet. eine kritischen Abschnitt.A statement block protected by an exclusive lock is sometimes called a critical section.

RegelnRules

  • Branch.Branching. Sie können keine branch in einen SyncLock Blockieren von außerhalb des Blocks.You cannot branch into a SyncLock block from outside the block.

  • Der Wert der Sperre-Objekts.Lock Object Value. Der Wert des lockobject nicht Nothing.The value of lockobject cannot be Nothing. Sie müssen das Sperrobjekt erstellen, bevor Sie ihn im Verwenden einer SyncLock Anweisung.You must create the lock object before you use it in a SyncLock statement.

    Sie können den Wert nicht ändern lockobject während der Ausführung einer SyncLock Block.You cannot change the value of lockobject while executing a SyncLock block. Der Mechanismus ist erforderlich, dass das Sperrobjekt unverändert bleiben.The mechanism requires that the lock object remain unchanged.

  • Können keine der "await" -Operator in einem SyncLock Block.You can't use the Await operator in a SyncLock block.

VerhaltenBehavior

  • Mechanismus.Mechanism. Wenn ein Thread erreicht die SyncLock -Anweisung, es ergibt die lockobject Ausdruck und angehalten, bis er eine exklusive Sperre für das Objekt, das vom Ausdruck zurückgegebene erhält.When a thread reaches the SyncLock statement, it evaluates the lockobject expression and suspends execution until it acquires an exclusive lock on the object returned by the expression. Wenn ein anderer Thread erreicht die SyncLock -Anweisung, es ist nicht Ruft eine Sperre, bis der erste Thread führt die End SyncLock Anweisung.When another thread reaches the SyncLock statement, it does not acquire a lock until the first thread executes the End SyncLock statement.

  • Stellen Sie geschützte Daten.Protected Data. Wenn lockobject ist eine Shared Variablen, die exklusive Sperre verhindert, dass einen Thread in jeder Instanz der Klasse Ausführen der SyncLock zu blockieren, während alle anderen Thread ausgeführt wird.If lockobject is a Shared variable, the exclusive lock prevents a thread in any instance of the class from executing the SyncLock block while any other thread is executing it. Dies schützt die Daten, die von allen Instanzen gemeinsam verwendet werden.This protects data that is shared among all the instances.

    Wenn lockobject ist eine Instanzvariable (nicht Shared), die Sperre verhindert einen Thread, in der aktuellen Instanz der Ausführung der SyncLock Block zur gleichen Zeit wie ein anderer Thread in der gleichen Instanz.If lockobject is an instance variable (not Shared), the lock prevents a thread running in the current instance from executing the SyncLock block at the same time as another thread in the same instance. Dies schützt die Daten, die von den einzelnen Instanzen verwaltet wird.This protects data maintained by the individual instance.

  • Abruf und die Freigabe.Acquisition and Release. Ein SyncLock Block verhält sich wie ein Try...Finally Konstruktion, in dem die Try Block erhält eine exklusive Sperre auf lockobject und Finally Block freigegeben wird.A SyncLock block behaves like a Try...Finally construction in which the Try block acquires an exclusive lock on lockobject and the Finally block releases it. Aus diesem Grund die SyncLock Block gewährleistet die Aufhebung der Sperre, unabhängig davon, wie Sie den Block zu beenden.Because of this, the SyncLock block guarantees release of the lock, no matter how you exit the block. Dies gilt auch im Falle einer nicht behandelten Ausnahme.This is true even in the case of an unhandled exception.

  • Framework-Aufrufe.Framework Calls. Die SyncLock Block erhält und hebt die exklusive Sperre durch Aufrufen der Enter und Exit Methoden der Monitor -Klasse in der System.Threading Namespace.The SyncLock block acquires and releases the exclusive lock by calling the Enter and Exit methods of the Monitor class in the System.Threading namespace.

Methoden für die ProgrammierungProgramming Practices

Die lockobject Ausdruck ergeben sollten immer ein Objekt, das ausschließlich auf die Klasse gehört.The lockobject expression should always evaluate to an object that belongs exclusively to your class. Deklarieren Sie eine Private Objektvariable zum Schutz von Daten, die auf die aktuelle Instanz gehören oder Private Shared Objektvariable, um Daten in allen Instanzen häufig zu schützen.You should declare a Private object variable to protect data belonging to the current instance, or a Private Shared object variable to protect data common to all instances.

Verwenden Sie nicht die Me Schlüsselwort, um eine Sperre geben z. B. Objektdaten.You should not use the Me keyword to provide a lock object for instance data. Wenn Code außerhalb der Klasse einen Verweis auf eine Instanz der Klasse enthält, können sie diesen Verweis verwenden, als Sperrobjekt für eine SyncLock blockieren, die von ihren Bildschirmen, grundlegend andere Daten geschützt werden.If code external to your class has a reference to an instance of your class, it could use that reference as a lock object for a SyncLock block completely different from yours, protecting different data. Auf diese Weise Ihre Klasse und die andere Klasse können einander blockieren hindert, die nicht verknüpfte SyncLock Blöcke.In this way, your class and the other class could block each other from executing their unrelated SyncLock blocks. Auf ähnliche Weise Sperren für eine Zeichenfolge kann problematisch sein, da es sich bei jedem anderen Code in den Prozess über die gleiche Zeichenfolge die gleiche Sperre freigibt.Similarly locking on a string can be problematic since any other code in the process using the same string will share the same lock.

Sie sollten auch nicht verwenden, die Me.GetType freigegebene Methode, um ein Sperrobjekt für bereitzustellen.You should also not use the Me.GetType method to provide a lock object for shared data. Grund hierfür ist, GetType gibt immer die gleiche Type Objekt für einen bestimmten Klassennamen.This is because GetType always returns the same Type object for a given class name. Externer Code Aufrufen GetType für Ihre Klasse und rufen Sie die gleiche Sperrobjekt, das Sie verwenden.External code could call GetType on your class and obtain the same lock object you are using. Dies führt zu die beiden Klassen, dass die von ihren SyncLock Blöcke.This would result in the two classes blocking each other from their SyncLock blocks.

BeispieleExamples

BeschreibungDescription

Das folgende Beispiel zeigt eine Klasse, die eine einfache Liste von Nachrichten verwaltet.The following example shows a class that maintains a simple list of messages. Sie enthält die Nachrichten in einem Array und das letzte Element dieses Arrays in eine Variable verwendet.It holds the messages in an array and the last used element of that array in a variable. Die addAnotherMessage Prozedur erhöht das letzte Element und speichert die neue Meldung.The addAnotherMessage procedure increments the last element and stores the new message. Diese beiden Vorgänge sind geschützt, indem die SyncLock und End SyncLock -Anweisungen, da nach das letzte Element erhöht wurde, die neue Nachricht gespeichert werden muss, bevor ein anderer Thread das letzte Element erneut erhöhen kann.Those two operations are protected by the SyncLock and End SyncLock statements, because once the last element has been incremented, the new message must be stored before any other thread can increment the last element again.

Wenn die simpleMessageList Klasse freigegeben, eine Liste von Nachrichten auf alle zugehörigen Instanzen, die Variablen messagesList und messagesLast deklariert werden würde, als Shared.If the simpleMessageList class shared one list of messages among all its instances, the variables messagesList and messagesLast would be declared as Shared. In diesem Fall ist die Variable messagesLock außerdem sollte der Shared, sodass es gäbe eine einzige Sperre-Objekt, das von jeder Instanz verwendet wird.In this case, the variable messagesLock should also be Shared, so that there would be a single lock object used by every instance.

CodeCode

Class simpleMessageList
    Public messagesList() As String = New String(50) {}
    Public messagesLast As Integer = -1
    Private messagesLock As New Object
    Public Sub addAnotherMessage(ByVal newMessage As String)
        SyncLock messagesLock
            messagesLast += 1
            If messagesLast < messagesList.Length Then
                messagesList(messagesLast) = newMessage
            End If
        End SyncLock
    End Sub
End Class

BeschreibungDescription

Im folgenden Beispiel wird die Threads und SyncLock.The following example uses threads and SyncLock. Solange die SyncLock Anweisung vorhanden ist, der Anweisungsblock ein Kritischer Abschnitt und balance wird nie eine negative Zahl.As long as the SyncLock statement is present, the statement block is a critical section and balance never becomes a negative number. Können Sie Auskommentieren der SyncLock und End SyncLock Anweisungen, um die Auswirkungen der auslassen finden Sie unter den SyncLock Schlüsselwort.You can comment out the SyncLock and End SyncLock statements to see the effect of leaving out the SyncLock keyword.

CodeCode

Imports System.Threading

Module Module1

    Class Account
        Dim thisLock As New Object
        Dim balance As Integer

        Dim r As New Random()

        Public Sub New(ByVal initial As Integer)
            balance = initial
        End Sub

        Public Function Withdraw(ByVal amount As Integer) As Integer
            ' This condition will never be true unless the SyncLock statement
            ' is commented out:
            If balance < 0 Then
                Throw New Exception("Negative Balance")
            End If

            ' Comment out the SyncLock and End SyncLock lines to see
            ' the effect of leaving out the SyncLock keyword.
            SyncLock thisLock
                If balance >= amount Then
                    Console.WriteLine("Balance before Withdrawal :  " & balance)
                    Console.WriteLine("Amount to Withdraw        : -" & amount)
                    balance = balance - amount
                    Console.WriteLine("Balance after Withdrawal  :  " & balance)
                    Return amount
                Else
                    ' Transaction rejected.
                    Return 0
                End If
            End SyncLock
        End Function

        Public Sub DoTransactions()
            For i As Integer = 0 To 99
                Withdraw(r.Next(1, 100))
            Next
        End Sub
    End Class

    Sub Main()
        Dim threads(10) As Thread
        Dim acc As New Account(1000)

        For i As Integer = 0 To 9
            Dim t As New Thread(New ThreadStart(AddressOf acc.DoTransactions))
            threads(i) = t
        Next

        For i As Integer = 0 To 9
            threads(i).Start()
        Next
    End Sub

End Module

KommentareComments

Siehe auchSee also