AsyncOperationManager.CreateOperation(Object) Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает объект AsyncOperation для контроля длительности конкретной асинхронной операции.
public:
static System::ComponentModel::AsyncOperation ^ CreateOperation(System::Object ^ userSuppliedState);
public static System.ComponentModel.AsyncOperation CreateOperation (object userSuppliedState);
public static System.ComponentModel.AsyncOperation CreateOperation (object? userSuppliedState);
static member CreateOperation : obj -> System.ComponentModel.AsyncOperation
Public Shared Function CreateOperation (userSuppliedState As Object) As AsyncOperation
Параметры
- userSuppliedState
- Object
Объект, используемый для связи элемента состояния клиента, например идентификатора задачи, с конкретной асинхронной операцией.
Возвращаемое значение
Объект AsyncOperation, который можно использовать для контроля длительности вызова асинхронного метода.
Примеры
В следующем примере кода демонстрируется использование CreateOperation метода для создания System.ComponentModel.AsyncOperation для отслеживания длительности асинхронных операций. Этот пример входит в состав более крупного примера использования класса 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
Комментарии
Метод CreateOperation возвращает объект , System.ComponentModel.AsyncOperation который можно использовать для отслеживания длительности конкретной асинхронной операции и оповещения модели приложения по завершении операции. Его также можно использовать для публикации обновлений хода выполнения и добавочных результатов без завершения операции. будет System.ComponentModel.AsyncOperation правильно маршалировать эти вызовы в соответствующий поток или контекст для модели приложения.
Если вы реализуете класс, поддерживающий асинхронный шаблон на основе событий, класс должен вызывать CreateOperation каждый раз при вызове метода MethodNameAsync
. Клиентское приложение, которое выполняет вызовы метода, может использовать userSuppliedState
параметр для уникальной идентификации каждого вызова, чтобы различать события, возникающие во время выполнения асинхронной операции.
Внимание!
Клиентский код должен предоставлять уникальное userSuppliedState
значение для параметра . Неуникальный идентификатор задач может привести к неправильному отчету о ходе реализации и других событиях. Код должен проверка для неуникальный идентификатор задачи и вызывать исключение при System.ArgumentException обнаружении.
Код должен отслеживать каждый System.ComponentModel.AsyncOperation возвращаемый методом CreateOperation и использовать объект в соответствующей базовой асинхронной операции для последующего обновления и завершения операции. Это отслеживание может быть таким же простым, как передача в System.ComponentModel.AsyncOperation качестве параметра между делегатами. В более сложных проектах класс может поддерживать коллекцию System.ComponentModel.AsyncOperation объектов, добавляя объекты при запуске задач и удаляя их при выполнении или отмене задач. Этот подход позволяет проверка для уникальных userSuppliedState
значений параметров и является методом, который следует использовать при работе с классами, поддерживающими несколько одновременных вызовов.
Дополнительные сведения о реализации асинхронных классов см. в статье Реализация асинхронного шаблона на основе событий.