AsyncOperationManager.CreateOperation(Object) Метод

Определение

Возвращает объект AsyncOperation для контроля длительности конкретной асинхронной операции.Returns an AsyncOperation for tracking the duration of a particular asynchronous operation.

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

Объект, используемый для связи элемента состояния клиента, например идентификатора задачи, с конкретной асинхронной операцией.An object used to associate a piece of client state, such as a task ID, with a particular asynchronous operation.

Возвращаемое значение

AsyncOperation

Объект AsyncOperation, который можно использовать для контроля длительности вызова асинхронного метода.An AsyncOperation that you can use to track the duration of an asynchronous method invocation.

Примеры

В следующем примере кода показано использование CreateOperation метода для создания System.ComponentModel.AsyncOperation для отслеживания длительности асинхронных операций.The following code example demonstrates using the CreateOperation method to create an System.ComponentModel.AsyncOperation for tracking the duration of asynchronous operations. Этот пример кода является частью большого примера, приведенного для AsyncOperationManager класса.This code example is part of a larger example provided for the AsyncOperationManager class.

// 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 , который можно использовать для отслеживания длительности определенной асинхронной операции и для предупреждения модели приложения по завершении операции.The CreateOperation method returns an System.ComponentModel.AsyncOperation that you can use to track the duration of a particular asynchronous operation and to alert the application model when the operation completes. Его также можно использовать для отправки обновлений хода выполнения и добавочных результатов без завершения операции.You can also use it to post progress updates and incremental results without terminating the operation. System.ComponentModel.AsyncOperationБудет правильно маршалировать эти вызовы в соответствующий поток или контекст для модели приложения.The System.ComponentModel.AsyncOperation will correctly marshal these calls to the appropriate thread or context for the application model.

При реализации класса, поддерживающего асинхронную модель на основе событий, класс должен вызывать CreateOperation каждый раз при Async вызове метода имя_метода.If you implement a class that supports the Event-based Asynchronous Pattern, your class should call CreateOperation each time your MethodNameAsync method is called. Клиентское приложение, которое обращается к методу, может использовать userSuppliedState параметр для уникальной идентификации каждого вызова, чтобы различать события, возникающие во время выполнения асинхронной операции.The client application that makes calls to the method can use the userSuppliedState parameter to uniquely identify each invocation, so as to distinguish events raised during the execution of the asynchronous operation.

Внимание!

Клиентский код должен предоставить уникальное значение для userSuppliedState параметра.Client code must provide a unique value for the userSuppliedState parameter. Идентификаторы неуникальных задач могут привести к тому, что ваша реализация сообщит о ходе выполнения и других событиях неверно.Non-unique task IDs may cause your implementation to report progress and other events incorrectly. Код должен проверять наличие неуникального идентификатора задачи и выдавать исключение, System.ArgumentException если оно обнаружено.Your code should check for a non-unique task ID and throw an System.ArgumentException if one is detected.

Код должен System.ComponentModel.AsyncOperation относить все возвращаемые CreateOperation объекты и использовать объект в соответствующей базовой асинхронной операции для публикации обновлений и завершения операции.Your code should track every System.ComponentModel.AsyncOperation returned by CreateOperation and use the object in the corresponding underlying asynchronous operation to post updates and terminate the operation. Это отслеживание может быть простым, так как передача в System.ComponentModel.AsyncOperation качестве параметра между делегатами.This tracking can be as simple as passing the System.ComponentModel.AsyncOperation as a parameter among delegates. В более сложных проектах класс может поддерживать коллекцию System.ComponentModel.AsyncOperation объектов, добавлять объекты при запуске задач и удалять их после завершения или отмены задач.In more sophisticated designs, your class can maintain a collection of System.ComponentModel.AsyncOperation objects, adding objects when tasks are started and removing them when tasks are completed or canceled. Такой подход позволяет проверять уникальные userSuppliedState значения параметров, а также метод, который следует использовать при работе с классами, поддерживающими несколько одновременных вызовов.This approach allows you to check for unique userSuppliedState parameter values, and is the method you should use when working with classes that support multiple concurrent invocations.

Дополнительные сведения о реализации асинхронных классов см. в разделе Реализация асинхронной модели на основе событий.For more information about implementing asynchronous classes, see Implementing the Event-based Asynchronous Pattern.

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

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