Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Асинхронная операция, использующая шаблон проектирования IAsyncResult, реализована как два метода BeginOperationName
и EndOperationName
, которые начинают и заканчивают асинхронную операцию OperationName соответственно. Например, класс FileStream предоставляет методы BeginRead для асинхронного чтения байтов из файла EndRead. Эти методы реализуют асинхронную версию Read метода.
Замечание
Начиная с .NET Framework 4 библиотека параллельных задач предоставляет новую модель для асинхронного и параллельного программирования. Дополнительные сведения см. в разделе "Библиотека параллельных задач" (TPL) и асинхронный шаблон на основе задач (TAP)).
После вызова BeginOperationName
приложение может продолжить выполнение инструкций в вызывающем потоке, пока асинхронная операция выполняется в другом потоке. Для каждого вызова BeginOperationName
, приложение должно также вызывать EndOperationName
, чтобы получить результаты операции.
Начало асинхронной операции
Метод BeginOperationName
начинает асинхронную операцию OperationName и возвращает объект, реализующий IAsyncResult интерфейс.
IAsyncResult объекты хранят сведения об асинхронной операции. В следующей таблице показаны сведения об асинхронной операции.
Член | Описание |
---|---|
AsyncState | Необязательный объект, специфичный для приложения, содержащий сведения об асинхронной операции. |
AsyncWaitHandle | Элемент WaitHandle, который можно использовать для приостановки выполнения приложения до завершения асинхронной операции. |
CompletedSynchronously | Значение, указывающее, завершилась ли асинхронная операция в потоке, используемом для вызова BeginOperationName вместо завершения в отдельном потоке ThreadPool. |
IsCompleted | Значение, указывающее, завершена ли асинхронная операция. |
Метод BeginOperationName
принимает любые параметры, объявленные в сигнатуре синхронной версии метода, которые передаются по значению или по ссылке. Параметры out не являются частью сигнатуры метода BeginOperationName
. Подпись BeginOperationName
метода также включает два дополнительных параметра. Первый из этих элементов определяет AsyncCallback делегат, который ссылается на метод, вызываемый после завершения асинхронной операции. Вызывающий объект может указать null
(Nothing
в Visual Basic), если он не хочет, чтобы метод вызывался после завершения операции. Второй дополнительный параметр — это определяемый пользователем объект. Этот объект можно использовать для передачи сведений о состоянии конкретного приложения методу, вызываемого при завершении асинхронной операции.
BeginOperationName
Если метод принимает дополнительные параметры для конкретной операции, например массив байтов для хранения байтов, считываемых из файла, AsyncCallback объект состояния приложения — это последние параметры в сигнатуре BeginOperationName
метода.
BeginOperationName
возвращает управление вызывающему потоку немедленно.
BeginOperationName
Если метод создает исключения, исключения возникают перед запуском асинхронной операции.
BeginOperationName
Если метод создает исключения, метод обратного вызова не вызывается.
Завершение асинхронной операции
Метод EndOperationName
завершает асинхронную операцию OperationName. Возвращаемое значение EndOperationName
метода является тем же типом, который возвращается его синхронным аналогом и относится к асинхронной операции. Например, EndRead метод возвращает количество байтов, считываемых из объекта FileStream , и EndGetHostByName метод возвращает IPHostEntry объект, содержащий сведения о хост-компьютере. Метод EndOperationName
принимает любые параметры out или ref, объявленные в сигнатуре синхронной версии метода. Помимо параметров из синхронного метода EndOperationName
, метод также включает IAsyncResult параметр. Вызывающие компоненты должны передать экземпляр, возвращенный соответствующим вызовом BeginOperationName
.
Если асинхронная операция, IAsyncResult представленная объектом, не завершена при EndOperationName
вызове, EndOperationName
блокирует вызывающий поток до завершения асинхронной операции. Исключения, выбрасываемые асинхронной операцией, выбрасываются из EndOperationName
метода. Эффект EndOperationName
вызова метода несколько раз с одинаковым IAsyncResult не определен. Аналогичным образом, вызов метода EndOperationName
с IAsyncResult, который не был возвращён соответствующим методом Begin, также не определён.
Замечание
Для любого из неопределенных сценариев реализующие должны рассмотреть возможность создания InvalidOperationException.
Замечание
Реализаторы этого шаблона проектирования должны уведомить вызывающего о том, что асинхронная операция выполнена, установив IsCompleted в true, вызвав асинхронный метод обратного вызова (если он был указан) и сигнализируя AsyncWaitHandle.
Разработчики приложений имеют несколько вариантов проектирования для доступа к результатам асинхронной операции. Правильный выбор зависит от того, имеет ли приложение инструкции, которые могут выполняться во время завершения операции. Если приложение не может выполнить дополнительную работу, пока не получит результаты асинхронной операции, приложение должно блокироваться до тех пор, пока результаты не будут доступны. Для блокировки до завершения асинхронной операции можно использовать один из следующих подходов:
Вызов
EndOperationName
из основного потока приложения, блокируя выполнение приложения до завершения операции. Пример, демонстрирующий этот метод, см. в разделе "Блокировка выполнения приложения путем завершения асинхронной операции".Используйте AsyncWaitHandle для блокировки выполнения приложения до завершения одной или нескольких операций. Пример, демонстрирующий этот метод, см. в разделе "Блокировка выполнения приложения с помощью AsyncWaitHandle".
Приложения, которые не должны блокироваться во время выполнения асинхронной операции, могут использовать один из следующих подходов:
Периодически проверяйте свойство IsCompleted для определения завершения операции и вызывайте
EndOperationName
при ее завершении. Пример, демонстрирующий этот метод, см. в разделе "Опрос состояния асинхронной операции".AsyncCallback Используйте делегат для указания метода, вызываемого при завершении операции. Пример, демонстрирующий этот метод, см. в разделе "Использование делегата AsyncCallback для завершения асинхронной операции".