ReaderWriterLock.UpgradeToWriterLock Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee wordt een lezervergrendeling bijgewerkt naar de schrijververgrendeling.
Overloads
| Name | Description |
|---|---|
| UpgradeToWriterLock(Int32) |
Hiermee wordt een lezervergrendeling bijgewerkt naar de schrijververgrendeling, met behulp van een Int32 waarde voor de time-out. |
| UpgradeToWriterLock(TimeSpan) |
Hiermee wordt een lezervergrendeling bijgewerkt naar de schrijververgrendeling, met behulp van een |
UpgradeToWriterLock(Int32)
Hiermee wordt een lezervergrendeling bijgewerkt naar de schrijververgrendeling, met behulp van een Int32 waarde voor de time-out.
public:
System::Threading::LockCookie UpgradeToWriterLock(int millisecondsTimeout);
public System.Threading.LockCookie UpgradeToWriterLock(int millisecondsTimeout);
member this.UpgradeToWriterLock : int -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (millisecondsTimeout As Integer) As LockCookie
Parameters
- millisecondsTimeout
- Int32
De time-out in milliseconden.
Retouren
Een LockCookie waarde.
Uitzonderingen
millisecondsTimeout verloopt voordat de vergrendelingsaanvraag wordt verleend.
Voorbeelden
In het volgende codevoorbeeld ziet u hoe u een lezervergrendeling aanvraagt, de lezervergrendeling bijwerkt naar een schrijververgrendeling en een downgrade naar een lezervergrendeling opnieuw uitvoert.
Deze code maakt deel uit van een groter voorbeeld voor de ReaderWriterLock klasse.
// The complete code is located in the ReaderWriterLock class topic.
using System;
using System.Threading;
public class Example
{
static ReaderWriterLock rwl = new ReaderWriterLock();
// Define the shared resource protected by the ReaderWriterLock.
static int resource = 0;
' The complete code is located in the ReaderWriterLock class topic.
Imports System.Threading
Public Module Example
Private rwl As New ReaderWriterLock()
' Define the shared resource protected by the ReaderWriterLock.
Private resource As Integer = 0
// Requests a reader lock, upgrades the reader lock to the writer
// lock, and downgrades it to a reader lock again.
static void UpgradeDowngrade(Random rnd, int timeOut)
{
try {
rwl.AcquireReaderLock(timeOut);
try {
// It's safe for this thread to read from the shared resource.
Display("reads resource value " + resource);
Interlocked.Increment(ref reads);
// To write to the resource, either release the reader lock and
// request the writer lock, or upgrade the reader lock. Upgrading
// the reader lock puts the thread in the write queue, behind any
// other threads that might be waiting for the writer lock.
try {
LockCookie lc = rwl.UpgradeToWriterLock(timeOut);
try {
// It's safe for this thread to read or write from the shared resource.
resource = rnd.Next(500);
Display("writes resource value " + resource);
Interlocked.Increment(ref writes);
}
finally {
// Ensure that the lock is released.
rwl.DowngradeFromWriterLock(ref lc);
}
}
catch (ApplicationException) {
// The upgrade request timed out.
Interlocked.Increment(ref writerTimeouts);
}
// If the lock was downgraded, it's still safe to read from the resource.
Display("reads resource value " + resource);
Interlocked.Increment(ref reads);
}
finally {
// Ensure that the lock is released.
rwl.ReleaseReaderLock();
}
}
catch (ApplicationException) {
// The reader lock request timed out.
Interlocked.Increment(ref readerTimeouts);
}
}
' Requests a reader lock, upgrades the reader lock to the writer
' lock, and downgrades it to a reader lock again.
Sub UpgradeDowngrade(rnd As Random, timeOut As Integer)
Try
rwl.AcquireReaderLock(timeOut)
Try
' It's safe for this thread to read from the shared resource.
Display("reads resource value " & resource)
Interlocked.Increment(reads)
' To write to the resource, either release the reader lock and
' request the writer lock, or upgrade the reader lock. Upgrading
' the reader lock puts the thread in the write queue, behind any
' other threads that might be waiting for the writer lock.
Try
Dim lc As LockCookie = rwl.UpgradeToWriterLock(timeOut)
Try
' It's safe for this thread to read or write from the shared resource.
resource = rnd.Next(500)
Display("writes resource value " & resource)
Interlocked.Increment(writes)
Finally
' Ensure that the lock is released.
rwl.DowngradeFromWriterLock(lc)
End Try
Catch ex As ApplicationException
' The upgrade request timed out.
Interlocked.Increment(writerTimeouts)
End Try
' If the lock was downgraded, it's still safe to read from the resource.
Display("reads resource value " & resource)
Interlocked.Increment(reads)
Finally
' Ensure that the lock is released.
rwl.ReleaseReaderLock()
End Try
Catch ex As ApplicationException
' The reader lock request timed out.
Interlocked.Increment(readerTimeouts)
End Try
End Sub
}
End Module
Opmerkingen
Wanneer een thread de lezervergrendeling aanroept UpgradeToWriterLock , wordt vrijgegeven, ongeacht het aantal vergrendelingen en gaat de thread naar het einde van de wachtrij voor de schrijververgrendeling. Andere threads kunnen dus naar de resource schrijven voordat aan de thread waarvoor de upgrade is aangevraagd, de schrijververgrendeling wordt verleend.
Important
De time-outuitzondering wordt pas gegenereerd als de thread die de UpgradeToWriterLock methode aangeroepen heeft, de lezervergrendeling opnieuw kan aanvragen. Als er geen andere threads wachten op de schrijfvergrendeling, gebeurt dit onmiddellijk. Als er echter een andere thread in de wachtrij staat voor de schrijfvergrendeling, kan de thread die de UpgradeToWriterLock methode wordt genoemd, de lezervergrendeling pas opnieuw verkrijgen nadat alle huidige lezers hun vergrendelingen hebben vrijgegeven en één thread de schrijververgrendeling heeft verkregen en vrijgegeven. Dit geldt zelfs als de andere thread die de schrijfvergrendeling heeft aangevraagd, deze heeft aangevraagd nadat de huidige thread de UpgradeToWriterLock methode heeft aangeroepen.
Als u de vergrendelingsstatus wilt herstellen, roept DowngradeFromWriterLock u aan met behulp van de LockCookie geretourneerde status UpgradeToWriterLock. Gebruik dit LockCookie niet met RestoreLock.
Wanneer een thread geen lezervergrendeling heeft, moet u deze niet gebruiken UpgradeToWriterLock. Gebruik in plaats daarvan AcquireWriterLock.
Zie voor geldige time-outwaarden ReaderWriterLock.
Zie ook
- Het Beheerd Draadbeheer
- ReaderWriterLock
Van toepassing op
UpgradeToWriterLock(TimeSpan)
Hiermee wordt een lezervergrendeling bijgewerkt naar de schrijververgrendeling, met behulp van een TimeSpan waarde voor de time-out.
public:
System::Threading::LockCookie UpgradeToWriterLock(TimeSpan timeout);
public System.Threading.LockCookie UpgradeToWriterLock(TimeSpan timeout);
member this.UpgradeToWriterLock : TimeSpan -> System.Threading.LockCookie
Public Function UpgradeToWriterLock (timeout As TimeSpan) As LockCookie
Parameters
- timeout
- TimeSpan
De TimeSpan time-outperiode opgeven.
Retouren
Een LockCookie waarde.
Uitzonderingen
timeout verloopt voordat de vergrendelingsaanvraag wordt verleend.
timeout geeft een andere negatieve waarde dan -1 milliseconden.
Opmerkingen
Wanneer een thread de lezervergrendeling aanroept UpgradeToWriterLock , wordt vrijgegeven, ongeacht het aantal vergrendelingen en gaat de thread naar het einde van de wachtrij voor de schrijververgrendeling. Andere threads kunnen dus naar de resource schrijven voordat aan de thread waarvoor de upgrade is aangevraagd, de schrijververgrendeling wordt verleend.
Important
De time-outuitzondering wordt pas gegenereerd als de thread die de UpgradeToWriterLock methode aangeroepen heeft, de lezervergrendeling opnieuw kan aanvragen. Als er geen andere threads wachten op de schrijfvergrendeling, gebeurt dit onmiddellijk. Als er echter een andere thread in de wachtrij staat voor de schrijfvergrendeling, kan de thread die de UpgradeToWriterLock methode wordt genoemd, de lezervergrendeling pas opnieuw verkrijgen nadat alle huidige lezers hun vergrendelingen hebben vrijgegeven en één thread de schrijververgrendeling heeft verkregen en vrijgegeven. Dit geldt zelfs als de andere thread die de schrijfvergrendeling heeft aangevraagd, deze heeft aangevraagd nadat de huidige thread de UpgradeToWriterLock methode heeft aangeroepen.
Als u de vergrendelingsstatus wilt herstellen, roept DowngradeFromWriterLock u aan met behulp van de LockCookie geretourneerde status UpgradeToWriterLock. Gebruik dit LockCookie niet met RestoreLock.
Wanneer een thread geen lezervergrendeling heeft, moet u deze niet gebruiken UpgradeToWriterLock. Gebruik in plaats daarvan AcquireWriterLock.
Zie voor geldige time-outwaarden ReaderWriterLock.
Zie ook
- Het Beheerd Draadbeheer
- ReaderWriterLock