WaitHandle.WaitOne Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал.
Перегрузки
| Имя | Описание |
|---|---|
| WaitOne() |
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал. |
| WaitOne(Int32) |
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени в миллисекундах. |
| WaitOne(TimeSpan) |
Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan интервал времени. |
| WaitOne(Int32, Boolean) |
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени и указать, следует ли выйти из домена синхронизации перед ожиданием. |
| WaitOne(TimeSpan, Boolean) |
Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan интервал времени и указав, следует ли выйти из домена синхронизации перед ожиданием. |
WaitOne()
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал.
public:
virtual bool WaitOne();
public virtual bool WaitOne();
abstract member WaitOne : unit -> bool
override this.WaitOne : unit -> bool
Public Overridable Function WaitOne () As Boolean
Возвращаемое значение
true Если текущий экземпляр получает сигнал. Если текущий экземпляр никогда не сигнализирует, WaitOne() никогда не возвращается.
Исключения
Текущий экземпляр уже удален.
Ожидание завершено, так как поток завершился без освобождения мьютекса.
Текущий экземпляр является прозрачным прокси-сервером для другого WaitHandle домена приложения.
Примеры
В следующем примере кода показано, как использовать дескриптор ожидания для завершения процесса во время ожидания завершения фонового потока.
using System;
using System.Threading;
class WaitOne
{
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Main starting.");
ThreadPool.QueueUserWorkItem(
new WaitCallback(WorkMethod), autoEvent);
// Wait for work method to signal.
autoEvent.WaitOne();
Console.WriteLine("Work method signaled.\nMain ending.");
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("Work starting.");
// Simulate time spent working.
Thread.Sleep(new Random().Next(100, 2000));
// Signal that work is finished.
Console.WriteLine("Work ending.");
((AutoResetEvent)stateInfo).Set();
}
}
Imports System.Threading
Public Class WaitOne
Shared autoEvent As New AutoResetEvent(False)
<MTAThread> _
Shared Sub Main()
Console.WriteLine("Main starting.")
ThreadPool.QueueUserWorkItem(AddressOf WorkMethod, autoEvent)
' Wait for work method to signal.
autoEvent.WaitOne()
Console.WriteLine("Work method signaled.")
Console.WriteLine("Main ending.")
End Sub
Shared Sub WorkMethod(stateInfo As Object)
Console.WriteLine("Work starting.")
' Simulate time spent working.
Thread.Sleep(New Random().Next(100, 2000))
' Signal that work is finished.
Console.WriteLine("Work ending.")
CType(stateInfo, AutoResetEvent).Set()
End Sub
End Class
Комментарии
AbandonedMutexException является новым в .NET Framework версии 2.0. В предыдущих версиях WaitOne метод возвращается true при отказе от мьютекса. Заброшенный мьютекс часто указывает на серьезную ошибку кодирования. В случае с мьютексом на уровне системы может быть указано, что приложение было внезапно завершено (например, с помощью диспетчера задач Windows). Исключение содержит сведения, полезные для отладки.
Вызывающий метод блокируется на неопределенный срок, пока текущий экземпляр не получит сигнал. Этот метод используется для блокировки до WaitHandle получения сигнала от другого потока, например при завершении асинхронной операции. Дополнительные сведения см. в интерфейсе IAsyncResult.
Вызов перегрузки этого метода эквивалентен вызову WaitOne(Int32, Boolean) перегрузки метода и указанию -1 или Timeout.Infinite первого параметра и false второго параметра.
Переопределите этот метод, чтобы настроить поведение производных классов.
Применяется к
WaitOne(Int32)
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени в миллисекундах.
public:
virtual bool WaitOne(int millisecondsTimeout);
public virtual bool WaitOne(int millisecondsTimeout);
abstract member WaitOne : int -> bool
override this.WaitOne : int -> bool
Public Overridable Function WaitOne (millisecondsTimeout As Integer) As Boolean
Параметры
- millisecondsTimeout
- Int32
Количество миллисекунда, ожидающее или Infinite (-1) для ожидания на неопределенный срок.
Возвращаемое значение
true Значение , если текущий экземпляр получает сигнал; falseв противном случае .
Исключения
Текущий экземпляр уже удален.
millisecondsTimeout — отрицательное число, отличное от -1, которое представляет бесконечное время ожидания.
Ожидание завершено, так как поток завершился без освобождения мьютекса.
Текущий экземпляр является прозрачным прокси-сервером для другого WaitHandle домена приложения.
Примеры
В следующем примере кода показано, как использовать дескриптор ожидания для завершения процесса во время ожидания завершения фонового потока.
using System;
using System.Threading;
class WaitOne
{
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Main starting.");
ThreadPool.QueueUserWorkItem(
new WaitCallback(WorkMethod), autoEvent);
// Wait for work method to signal.
if(autoEvent.WaitOne(1000))
{
Console.WriteLine("Work method signaled.");
}
else
{
Console.WriteLine("Timed out waiting for work " +
"method to signal.");
}
Console.WriteLine("Main ending.");
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("Work starting.");
// Simulate time spent working.
Thread.Sleep(new Random().Next(100, 2000));
// Signal that work is finished.
Console.WriteLine("Work ending.");
((AutoResetEvent)stateInfo).Set();
}
}
Imports System.Threading
Public Class WaitOne
Shared autoEvent As New AutoResetEvent(False)
<MTAThread> _
Shared Sub Main()
Console.WriteLine("Main starting.")
ThreadPool.QueueUserWorkItem(AddressOf WorkMethod, autoEvent)
' Wait for work method to signal.
If autoEvent.WaitOne(1000) Then
Console.WriteLine("Work method signaled.")
Else
Console.WriteLine("Timed out waiting for work " & _
"method to signal.")
End If
Console.WriteLine("Main ending.")
End Sub
Shared Sub WorkMethod(stateInfo As Object)
Console.WriteLine("Work starting.")
' Simulate time spent working.
Thread.Sleep(New Random().Next(100, 2000))
' Signal that work is finished.
Console.WriteLine("Work ending.")
CType(stateInfo, AutoResetEvent).Set()
End Sub
End Class
Комментарии
Если millisecondsTimeout значение равно нулю, метод не блокируется. Он проверяет состояние дескриптора ожидания и возвращается немедленно.
Вызывающий метод блокирует до тех пор, пока текущий экземпляр не получит сигнал или время ожидания. Этот метод используется для блокировки до WaitHandle получения сигнала от другого потока, например при завершении асинхронной операции. Дополнительные сведения см. в интерфейсе IAsyncResult.
Переопределите этот метод, чтобы настроить поведение производных классов.
Вызов перегрузки этого метода совпадает с вызовом перегрузки WaitOne(Int32, Boolean) и указанием false для exitContext.
Применяется к
WaitOne(TimeSpan)
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan интервал времени.
public:
virtual bool WaitOne(TimeSpan timeout);
public virtual bool WaitOne(TimeSpan timeout);
abstract member WaitOne : TimeSpan -> bool
override this.WaitOne : TimeSpan -> bool
Public Overridable Function WaitOne (timeout As TimeSpan) As Boolean
Параметры
- timeout
- TimeSpan
Значение TimeSpan , представляющее количество миллисекунда для ожидания, или значение TimeSpan , представляющее -1 миллисекундах, которые будут ждать неограниченное время.
Возвращаемое значение
true Значение , если текущий экземпляр получает сигнал; falseв противном случае .
Исключения
Текущий экземпляр уже удален.
timeout — отрицательное число, отличное от -1 миллисекундах, которое представляет бесконечное время ожидания.
–или–
timeout больше int32.MaxValue.
Ожидание завершено, так как поток завершился без освобождения мьютекса.
Текущий экземпляр является прозрачным прокси-сервером для другого WaitHandle домена приложения.
Комментарии
Если timeout значение равно нулю, метод не блокируется. Он проверяет состояние дескриптора ожидания и возвращается немедленно.
Вызывающий метод блокирует до тех пор, пока текущий экземпляр не получит сигнал или время ожидания. Этот метод используется для блокировки до WaitHandle получения сигнала от другого потока, например при завершении асинхронной операции. Дополнительные сведения см. в интерфейсе IAsyncResult.
Переопределите этот метод, чтобы настроить поведение производных классов.
Максимальное значение для timeoutInt32.MaxValue.
Вызов перегрузки этого метода совпадает с вызовом перегрузки WaitOne(TimeSpan, Boolean) и указанием false для exitContext.
Применяется к
WaitOne(Int32, Boolean)
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
Блокирует текущий поток, пока текущий WaitHandle не получит сигнал, используя 32-разрядное целое число со знаком, чтобы указать интервал времени и указать, следует ли выйти из домена синхронизации перед ожиданием.
public:
virtual bool WaitOne(int millisecondsTimeout, bool exitContext);
public virtual bool WaitOne(int millisecondsTimeout, bool exitContext);
abstract member WaitOne : int * bool -> bool
override this.WaitOne : int * bool -> bool
Public Overridable Function WaitOne (millisecondsTimeout As Integer, exitContext As Boolean) As Boolean
Параметры
- millisecondsTimeout
- Int32
Количество миллисекунда, ожидающее или Infinite (-1) для ожидания на неопределенный срок.
- exitContext
- Boolean
true чтобы выйти из домена синхронизации для контекста перед ожиданием (если в синхронизированном контексте) и повторно приступить к нему; falseв противном случае .
Возвращаемое значение
true Значение , если текущий экземпляр получает сигнал; falseв противном случае .
Исключения
Текущий экземпляр уже удален.
millisecondsTimeout — отрицательное число, отличное от -1, которое представляет бесконечное время ожидания.
Ожидание завершено, так как поток завершился без освобождения мьютекса.
Текущий экземпляр является прозрачным прокси-сервером для другого WaitHandle домена приложения.
Примеры
В следующем примере показано, как работает перегрузка WaitOne(Int32, Boolean) метода при вызове в домене синхронизации. Во-первых, поток ожидает с exitContext заданным значением false и блоками до истечения срока ожидания. Второй поток выполняется после завершения первого потока и ожидает заданного exitContext значения true. Вызов сигнала дескриптора ожидания для этого второго потока не блокируется, и поток завершается до истечения времени ожидания.
using System;
using System.Threading;
using System.Runtime.Remoting.Contexts;
[Synchronization(true)]
public class SyncingClass : ContextBoundObject
{
private EventWaitHandle waitHandle;
public SyncingClass()
{
waitHandle =
new EventWaitHandle(false, EventResetMode.ManualReset);
}
public void Signal()
{
Console.WriteLine("Thread[{0:d4}]: Signalling...", Thread.CurrentThread.GetHashCode());
waitHandle.Set();
}
public void DoWait(bool leaveContext)
{
bool signalled;
waitHandle.Reset();
Console.WriteLine("Thread[{0:d4}]: Waiting...", Thread.CurrentThread.GetHashCode());
signalled = waitHandle.WaitOne(3000, leaveContext);
if (signalled)
{
Console.WriteLine("Thread[{0:d4}]: Wait released!!!", Thread.CurrentThread.GetHashCode());
}
else
{
Console.WriteLine("Thread[{0:d4}]: Wait timeout!!!", Thread.CurrentThread.GetHashCode());
}
}
}
public class TestSyncDomainWait
{
public static void Main()
{
SyncingClass syncClass = new SyncingClass();
Thread runWaiter;
Console.WriteLine("\nWait and signal INSIDE synchronization domain:\n");
runWaiter = new Thread(RunWaitKeepContext);
runWaiter.Start(syncClass);
Thread.Sleep(1000);
Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode());
// This call to Signal will block until the timeout in DoWait expires.
syncClass.Signal();
runWaiter.Join();
Console.WriteLine("\nWait and signal OUTSIDE synchronization domain:\n");
runWaiter = new Thread(RunWaitLeaveContext);
runWaiter.Start(syncClass);
Thread.Sleep(1000);
Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode());
// This call to Signal is unblocked and will set the wait handle to
// release the waiting thread.
syncClass.Signal();
runWaiter.Join();
}
public static void RunWaitKeepContext(object parm)
{
((SyncingClass)parm).DoWait(false);
}
public static void RunWaitLeaveContext(object parm)
{
((SyncingClass)parm).DoWait(true);
}
}
// The output for the example program will be similar to the following:
//
// Wait and signal INSIDE synchronization domain:
//
// Thread[0004]: Waiting...
// Thread[0001]: Signal...
// Thread[0004]: Wait timeout!!!
// Thread[0001]: Signalling...
//
// Wait and signal OUTSIDE synchronization domain:
//
// Thread[0006]: Waiting...
// Thread[0001]: Signal...
// Thread[0001]: Signalling...
// Thread[0006]: Wait released!!!
Imports System.Threading
Imports System.Runtime.Remoting.Contexts
<Synchronization(true)>
Public Class SyncingClass
Inherits ContextBoundObject
Private waitHandle As EventWaitHandle
Public Sub New()
waitHandle = New EventWaitHandle(false, EventResetMode.ManualReset)
End Sub
Public Sub Signal()
Console.WriteLine("Thread[{0:d4}]: Signalling...", Thread.CurrentThread.GetHashCode())
waitHandle.Set()
End Sub
Public Sub DoWait(leaveContext As Boolean)
Dim signalled As Boolean
waitHandle.Reset()
Console.WriteLine("Thread[{0:d4}]: Waiting...", Thread.CurrentThread.GetHashCode())
signalled = waitHandle.WaitOne(3000, leaveContext)
If signalled Then
Console.WriteLine("Thread[{0:d4}]: Wait released!!!", Thread.CurrentThread.GetHashCode())
Else
Console.WriteLine("Thread[{0:d4}]: Wait timeout!!!", Thread.CurrentThread.GetHashCode())
End If
End Sub
End Class
Public Class TestSyncDomainWait
Public Shared Sub Main()
Dim syncClass As New SyncingClass()
Dim runWaiter As Thread
Console.WriteLine(Environment.NewLine + "Wait and signal INSIDE synchronization domain:" + Environment.NewLine)
runWaiter = New Thread(AddressOf RunWaitKeepContext)
runWaiter.Start(syncClass)
Thread.Sleep(1000)
Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode())
' This call to Signal will block until the timeout in DoWait expires.
syncClass.Signal()
runWaiter.Join()
Console.WriteLine(Environment.NewLine + "Wait and signal OUTSIDE synchronization domain:" + Environment.NewLine)
runWaiter = New Thread(AddressOf RunWaitLeaveContext)
runWaiter.Start(syncClass)
Thread.Sleep(1000)
Console.WriteLine("Thread[{0:d4}]: Signal...", Thread.CurrentThread.GetHashCode())
' This call to Signal is unblocked and will set the wait handle to
' release the waiting thread.
syncClass.Signal()
runWaiter.Join()
End Sub
Public Shared Sub RunWaitKeepContext(parm As Object)
Dim syncClass As SyncingClass = CType(parm, SyncingClass)
syncClass.DoWait(False)
End Sub
Public Shared Sub RunWaitLeaveContext(parm As Object)
Dim syncClass As SyncingClass = CType(parm, SyncingClass)
syncClass.DoWait(True)
End Sub
End Class
' The output for the example program will be similar to the following:
'
' Wait and signal INSIDE synchronization domain:
'
' Thread[0004]: Waiting...
' Thread[0001]: Signal...
' Thread[0004]: Wait timeout!!!
' Thread[0001]: Signalling...
'
' Wait and signal OUTSIDE synchronization domain:
'
' Thread[0006]: Waiting...
' Thread[0001]: Signal...
' Thread[0001]: Signalling...
' Thread[0006]: Wait released!!!
Комментарии
Если millisecondsTimeout значение равно нулю, метод не блокируется. Он проверяет состояние дескриптора ожидания и возвращается немедленно.
При отказе AbandonedMutexException от мьютекса создается исключение. Заброшенный мьютекс часто указывает на серьезную ошибку кодирования. В случае с мьютексом на уровне системы может быть указано, что приложение было внезапно завершено (например, с помощью диспетчера задач Windows). Исключение содержит сведения, полезные для отладки.
Вызывающий метод блокирует до тех пор, пока текущий экземпляр не получит сигнал или время ожидания. Этот метод используется для блокировки до WaitHandle получения сигнала от другого потока, например при завершении асинхронной операции. Дополнительные сведения см. в интерфейсе IAsyncResult.
Переопределите этот метод, чтобы настроить поведение производных классов.
Выход из контекста
Параметр exitContext не действует, если этот метод не вызывается внутри недефакулируемых управляемых контекстов. Управляемый контекст может быть несознанным, если поток находится внутри вызова экземпляра класса, производного от ContextBoundObject. Даже если вы в настоящее время выполняете метод в классе, который не является производным от ContextBoundObject, например String, вы можете находиться в неразделаемом контексте, если ContextBoundObject он находится в стеке в текущем домене приложения.
При выполнении кода в недефакционном контексте, указывая true для exitContext того, чтобы поток вышел из недефаультного управляемого контекста (т. е. для перехода в контекст по умолчанию) перед выполнением этого метода. Поток возвращается в исходный недефакторный контекст после завершения вызова этого метода.
Выход из контекста может оказаться полезным, если класс с привязкой контекста имеет SynchronizationAttribute атрибут. В этом случае все вызовы к членам класса синхронизируются автоматически, а домен синхронизации — весь текст кода для класса. Если код в стеке вызовов члена вызывает этот метод и указывает true для exitContextэтого, поток выходит из домена синхронизации, что позволяет потоку, блокированному при вызове любого члена объекта, продолжить. Когда этот метод возвращается, поток, который сделал вызов, должен ждать повторного приема домена синхронизации.
Применяется к
WaitOne(TimeSpan, Boolean)
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
- Исходный код:
- WaitHandle.cs
Блокирует текущий поток, пока текущий экземпляр не получит сигнал, используя TimeSpan интервал времени и указав, следует ли выйти из домена синхронизации перед ожиданием.
public:
virtual bool WaitOne(TimeSpan timeout, bool exitContext);
public virtual bool WaitOne(TimeSpan timeout, bool exitContext);
abstract member WaitOne : TimeSpan * bool -> bool
override this.WaitOne : TimeSpan * bool -> bool
Public Overridable Function WaitOne (timeout As TimeSpan, exitContext As Boolean) As Boolean
Параметры
- timeout
- TimeSpan
Значение TimeSpan , представляющее количество миллисекунда для ожидания, или значение TimeSpan , представляющее -1 миллисекундах, которые будут ждать неограниченное время.
- exitContext
- Boolean
true чтобы выйти из домена синхронизации для контекста перед ожиданием (если в синхронизированном контексте) и повторно приступить к нему; falseв противном случае .
Возвращаемое значение
true Значение , если текущий экземпляр получает сигнал; falseв противном случае .
Исключения
Текущий экземпляр уже удален.
timeout — отрицательное число, отличное от -1 миллисекундах, которое представляет бесконечное время ожидания.
–или–
timeout больше int32.MaxValue.
Ожидание завершено, так как поток завершился без освобождения мьютекса.
Текущий экземпляр является прозрачным прокси-сервером для другого WaitHandle домена приложения.
Примеры
В следующем примере кода показано, как использовать дескриптор ожидания для завершения процесса во время ожидания завершения фонового потока.
using System;
using System.Threading;
class WaitOne
{
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Main starting.");
ThreadPool.QueueUserWorkItem(
new WaitCallback(WorkMethod), autoEvent);
// Wait for work method to signal.
if(autoEvent.WaitOne(new TimeSpan(0, 0, 1), false))
{
Console.WriteLine("Work method signaled.");
}
else
{
Console.WriteLine("Timed out waiting for work " +
"method to signal.");
}
Console.WriteLine("Main ending.");
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("Work starting.");
// Simulate time spent working.
Thread.Sleep(new Random().Next(100, 2000));
// Signal that work is finished.
Console.WriteLine("Work ending.");
((AutoResetEvent)stateInfo).Set();
}
}
Imports System.Threading
Public Class WaitOne
Shared autoEvent As New AutoResetEvent(False)
<MTAThread> _
Shared Sub Main()
Console.WriteLine("Main starting.")
ThreadPool.QueueUserWorkItem(AddressOf WorkMethod, autoEvent)
' Wait for work method to signal.
If autoEvent.WaitOne(New TimeSpan(0, 0, 1), False) Then
Console.WriteLine("Work method signaled.")
Else
Console.WriteLine("Timed out waiting for work " & _
"method to signal.")
End If
Console.WriteLine("Main ending.")
End Sub
Shared Sub WorkMethod(stateInfo As Object)
Console.WriteLine("Work starting.")
' Simulate time spent working.
Thread.Sleep(New Random().Next(100, 2000))
' Signal that work is finished.
Console.WriteLine("Work ending.")
CType(stateInfo, AutoResetEvent).Set()
End Sub
End Class
Комментарии
Если timeout значение равно нулю, метод не блокируется. Он проверяет состояние дескриптора ожидания и возвращается немедленно.
При отказе AbandonedMutexException от мьютекса создается исключение. Заброшенный мьютекс часто указывает на серьезную ошибку кодирования. В случае с мьютексом на уровне системы может быть указано, что приложение было внезапно завершено (например, с помощью диспетчера задач Windows). Исключение содержит сведения, полезные для отладки.
Вызывающий метод блокирует до тех пор, пока текущий экземпляр не получит сигнал или время ожидания. Этот метод используется для блокировки до WaitHandle получения сигнала от другого потока, например при завершении асинхронной операции. Дополнительные сведения см. в интерфейсе IAsyncResult.
Переопределите этот метод, чтобы настроить поведение производных классов.
Максимальное значение для timeoutInt32.MaxValue.
Выход из контекста
Параметр exitContext не действует, если этот метод не вызывается внутри недефакулируемых управляемых контекстов. Управляемый контекст может быть несознанным, если поток находится внутри вызова экземпляра класса, производного от ContextBoundObject. Даже если вы в настоящее время выполняете метод в классе, который не является производным от ContextBoundObject, например String, вы можете находиться в неразделаемом контексте, если ContextBoundObject он находится в стеке в текущем домене приложения.
При выполнении кода в недефакционном контексте, указывая true для exitContext того, чтобы поток вышел из недефаультного управляемого контекста (т. е. для перехода в контекст по умолчанию) перед выполнением этого метода. Поток возвращается в исходный недефакторный контекст после завершения вызова этого метода.
Выход из контекста может оказаться полезным, если класс с привязкой контекста имеет SynchronizationAttribute атрибут. В этом случае все вызовы к членам класса синхронизируются автоматически, а домен синхронизации — весь текст кода для класса. Если код в стеке вызовов члена вызывает этот метод и указывает true для exitContextэтого, поток выходит из домена синхронизации, что позволяет потоку, блокированному при вызове любого члена объекта, продолжить. Когда этот метод возвращается, поток, который сделал вызов, должен ждать повторного приема домена синхронизации.