AsyncOperation Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Отслеживает время существования асинхронной операции.
public ref class AsyncOperation sealed
public sealed class AsyncOperation
type AsyncOperation = class
Public NotInheritable Class AsyncOperation
- Наследование
-
AsyncOperation
Примеры
В следующем примере кода показано использование AsyncOperation объекта для отслеживания времени существования асинхронных операций. Этот пример входит в состав более крупного примера использования класса System.ComponentModel.AsyncOperationManager.
Полный список кода см. в разделе Практическое руководство. Реализация компонента, поддерживающего асинхронную модель на основе событий. Полный список кода клиентской формы см. в разделе Практическое руководство. Реализация клиента асинхронной модели на основе событий.
// This method starts an asynchronous calculation.
// First, it checks the supplied task ID for uniqueness.
// If taskId is unique, it creates a new WorkerEventHandler
// and calls its BeginInvoke method to start the calculation.
public virtual void CalculatePrimeAsync(
int numberToTest,
object taskId)
{
// Create an AsyncOperation for taskId.
AsyncOperation asyncOp =
AsyncOperationManager.CreateOperation(taskId);
// Multiple threads will access the task dictionary,
// so it must be locked to serialize access.
lock (userStateToLifetime.SyncRoot)
{
if (userStateToLifetime.Contains(taskId))
{
throw new ArgumentException(
"Task ID parameter must be unique",
"taskId");
}
userStateToLifetime[taskId] = asyncOp;
}
// Start the asynchronous operation.
WorkerEventHandler workerDelegate = new WorkerEventHandler(CalculateWorker);
workerDelegate.BeginInvoke(
numberToTest,
asyncOp,
null,
null);
}
' This method starts an asynchronous calculation.
' First, it checks the supplied task ID for uniqueness.
' If taskId is unique, it creates a new WorkerEventHandler
' and calls its BeginInvoke method to start the calculation.
Public Overridable Sub CalculatePrimeAsync( _
ByVal numberToTest As Integer, _
ByVal taskId As Object)
' Create an AsyncOperation for taskId.
Dim asyncOp As AsyncOperation = _
AsyncOperationManager.CreateOperation(taskId)
' Multiple threads will access the task dictionary,
' so it must be locked to serialize access.
SyncLock userStateToLifetime.SyncRoot
If userStateToLifetime.Contains(taskId) Then
Throw New ArgumentException( _
"Task ID parameter must be unique", _
"taskId")
End If
userStateToLifetime(taskId) = asyncOp
End SyncLock
' Start the asynchronous operation.
Dim workerDelegate As New WorkerEventHandler( _
AddressOf CalculateWorker)
workerDelegate.BeginInvoke( _
numberToTest, _
asyncOp, _
Nothing, _
Nothing)
End Sub
Комментарии
При реализации класса в соответствии с обзором асинхронной модели на основе событий может потребоваться отслеживать время существования каждой асинхронной операции, вызываемой в экземпляре класса. Класс AsyncOperation предоставляет способы отслеживания и отчета о ходе выполнения асинхронной задачи.
В следующем списке указаны способы использования AsyncOperation объекта :
Чтобы сообщить клиенту о ходе выполнения и промежуточных результатах, вызовите Post из кода асинхронной рабочей роли.
Чтобы указать, что асинхронная задача завершена, или отменить ожидающую асинхронную задачу, вызовите .PostOperationCompleted
Класс должен получить объект для каждой AsyncOperation асинхронной задачи, вызывая AsyncOperationManager.CreateOperation при запуске каждой задачи. Чтобы разрешить клиенту различать отдельные асинхронные задачи, AsyncOperationManager.CreateOperation принимает параметр для уникального предоставленного клиентом маркера, который становится свойством UserSuppliedState . Затем он может использоваться клиентским кодом для определения конкретной асинхронной задачи, которая вызывает события хода выполнения или завершения.
Примечания для тех, кто наследует этот метод
Разработчики должны гарантировать PostOperationCompleted(SendOrPostCallback, Object) , что вызовы и Post(SendOrPostCallback, Object) являются асинхронными, чтобы поставщикам библиотек классов не нужно было беспокоиться о потенциальных переполнениях стека, если они предполагают асинхронное поведение в конкретной модели приложения, которая происходит синхронно.
Дополнительные сведения о реализации асинхронных классов см. в разделе Реализация асинхронной модели на основе событий.
Свойства
SynchronizationContext |
Возвращает объект SynchronizationContext, переданный в конструктор. |
UserSuppliedState |
Возвращает или задает объект, используемый для уникальной идентификации асинхронной операции. |
Методы
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
Finalize() |
Завершает асинхронную операцию. |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
OperationCompleted() |
Завершает время существования асинхронной операции. |
Post(SendOrPostCallback, Object) |
Вызывает делегата для потока или контекста, соответствующего модели приложения. |
PostOperationCompleted(SendOrPostCallback, Object) |
Завершает время существования асинхронной операции. |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |