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этого, поток выходит из домена синхронизации, что позволяет потоку, блокированному при вызове любого члена объекта, продолжить. Когда этот метод возвращается, поток, который сделал вызов, должен ждать повторного приема домена синхронизации.

Применяется к