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",
                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

Комментарии

Метод CreateOperation возвращает System.ComponentModel.AsyncOperation значение, которое можно использовать для отслеживания длительности конкретной асинхронной операции и оповещения модели приложения при завершении операции. Его также можно использовать для публикации обновлений хода выполнения и добавочных результатов без прекращения операции. Будет System.ComponentModel.AsyncOperation правильно маршалировать эти вызовы к соответствующему потоку или контексту для модели приложения.

Если вы реализуете класс, поддерживающий асинхронный шаблон на основе событий, класс должен вызываться CreateOperation при каждом вызове метода MethodNameAsync . Клиентское приложение, которое вызывает метод, может использовать userSuppliedState параметр для уникальной идентификации каждого вызова, чтобы различать события, возникающие во время выполнения асинхронной операции.

Предостережение

Клиентский код должен предоставить уникальное значение для userSuppliedState параметра. Не уникальные идентификаторы задач могут привести к тому, что реализация сообщает о ходе выполнения и других событиях неправильно. Код должен проверить идентификатор задачи, отличный от уникального, и вызвать System.ArgumentException его, если он обнаружен.

Код должен отслеживать каждый System.ComponentModel.AsyncOperation возвращенный CreateOperation объект и использовать объект в соответствующей базовой асинхронной операции для публикации обновлений и завершения операции. Это отслеживание может быть таким же простым, как передача System.ComponentModel.AsyncOperation параметра между делегатами. В более сложных конструкциях System.ComponentModel.AsyncOperation класс может поддерживать коллекцию объектов, добавляя объекты при запуске и удалении их при завершении или отмене задач. Этот подход позволяет проверять уникальные userSuppliedState значения параметров и использовать метод, который следует использовать при работе с классами, поддерживающими несколько одновременных вызовов.

Дополнительные сведения о реализации асинхронных классов см. в разделе "Реализация асинхронного шаблона на основе событий".

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

См. также раздел