ReaderWriterLock.AcquireWriterLock Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает блокировку записи.
Перегрузки
| Имя | Описание |
|---|---|
| AcquireWriterLock(Int32) |
Получает блокировку Int32 записи, используя значение времени ожидания. |
| AcquireWriterLock(TimeSpan) |
Получает блокировку TimeSpan записи, используя значение времени ожидания. |
AcquireWriterLock(Int32)
- Исходный код:
- ReaderWriterLock.cs
- Исходный код:
- ReaderWriterLock.cs
- Исходный код:
- ReaderWriterLock.cs
- Исходный код:
- ReaderWriterLock.cs
- Исходный код:
- ReaderWriterLock.cs
Получает блокировку Int32 записи, используя значение времени ожидания.
public:
void AcquireWriterLock(int millisecondsTimeout);
public void AcquireWriterLock(int millisecondsTimeout);
member this.AcquireWriterLock : int -> unit
Public Sub AcquireWriterLock (millisecondsTimeout As Integer)
Параметры
- millisecondsTimeout
- Int32
Время ожидания в миллисекундах.
Исключения
millisecondsTimeout истекает до предоставления запроса блокировки.
Примеры
В следующем примере кода показано, как получить и освободить блокировку записи и как обрабатывать исключение, возникающее при истечении времени ожидания запроса.
Этот код является частью более крупного примера, предоставленного ReaderWriterLock для класса.
// 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
// Request and release the writer lock, and handle time-outs.
static void WriteToResource(Random rnd, int timeOut)
{
try {
rwl.AcquireWriterLock(timeOut);
try {
// It's safe for this thread to access 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.ReleaseWriterLock();
}
}
catch (ApplicationException) {
// The writer lock request timed out.
Interlocked.Increment(ref writerTimeouts);
}
}
' Request and release the writer lock, and handle time-outs.
Sub WriteToResource(rnd As Random, timeOut As Integer)
Try
rwl.AcquireWriterLock(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.ReleaseWriterLock()
End Try
Catch ex As ApplicationException
' The writer lock request timed out.
Interlocked.Increment(writerTimeouts)
End Try
End Sub
}
End Module
Комментарии
Этот метод блокирует, если в другом потоке есть блокировка чтения или блокировка записи. Описание того, как блокировка записи чередуется с несколькими одновременными блоками чтения, см. в ReaderWriterLock этом классе.
Поток, который уже имеет блокировку чтения, может получить блокировку записи одним из двух способов: путем выпуска блокировки чтения перед вызовом AcquireWriterLockили путем вызова UpgradeToWriterLock.
Предостережение
Если поток вызывается AcquireWriterLock , пока он по-прежнему имеет блокировку чтения, он блокируется на собственной блокировке чтения; если указано бесконечное время ожидания, поток будет взаимоблокировкой. Чтобы избежать таких взаимоблокировок, используйте для IsReaderLockHeld определения того, имеет ли текущий поток блокировку чтения.
AcquireWriterLock поддерживает рекурсивные запросы на блокировку записи. То есть поток может вызывать AcquireWriterLock несколько раз, что увеличивает число блокировок каждый раз. При каждом вызове ReleaseWriterLockнеобходимо вызывать AcquireWriterLock один раз. Кроме того, можно немедленно ReleaseLock уменьшить число блокировок до нуля.
Запросы рекурсивной блокировки всегда предоставляются немедленно, не помещая поток запроса в очередь записи.
Допустимые значения времени ожидания см. в разделе ReaderWriterLock.
См. также раздел
Применяется к
AcquireWriterLock(TimeSpan)
- Исходный код:
- ReaderWriterLock.cs
- Исходный код:
- ReaderWriterLock.cs
- Исходный код:
- ReaderWriterLock.cs
- Исходный код:
- ReaderWriterLock.cs
- Исходный код:
- ReaderWriterLock.cs
Получает блокировку TimeSpan записи, используя значение времени ожидания.
public:
void AcquireWriterLock(TimeSpan timeout);
public void AcquireWriterLock(TimeSpan timeout);
member this.AcquireWriterLock : TimeSpan -> unit
Public Sub AcquireWriterLock (timeout As TimeSpan)
Параметры
- timeout
- TimeSpan
Указание TimeSpan периода ожидания.
Исключения
timeout истекает до предоставления запроса блокировки.
timeout указывает отрицательное значение, отличное от -1 миллисекунда.
Комментарии
Этот метод блокирует, если в другом потоке есть блокировка чтения или блокировка записи. Описание того, как блокировка записи чередуется с несколькими одновременными блоками чтения, см. в ReaderWriterLock этом классе.
Поток, который уже имеет блокировку чтения, может получить блокировку записи одним из двух способов: путем выпуска блокировки чтения перед вызовом AcquireWriterLockили путем вызова UpgradeToWriterLock.
Предостережение
Если поток вызывается AcquireWriterLock , пока он по-прежнему имеет блокировку чтения, он блокируется на собственной блокировке чтения; если указано бесконечное время ожидания, поток будет взаимоблокировкой. Чтобы избежать таких взаимоблокировок, используйте для IsReaderLockHeld определения того, имеет ли текущий поток блокировку чтения.
AcquireWriterLock поддерживает рекурсивные запросы на блокировку записи. То есть поток может вызывать AcquireWriterLock несколько раз, что увеличивает число блокировок каждый раз. При каждом вызове ReleaseWriterLockнеобходимо вызывать AcquireWriterLock один раз. Кроме того, можно немедленно ReleaseLock уменьшить число блокировок до нуля.
Запросы рекурсивной блокировки всегда предоставляются немедленно, не помещая поток запроса в очередь записи.
Допустимые значения времени ожидания см. в разделе ReaderWriterLock.