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",
nameof(taskId));
}
userStateToLifetime[taskId] = asyncOp;
}
// Start the asynchronous operation.
WorkerEventHandler workerDelegate = new(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) |