Поделиться через


AsyncOperationManager Класс

Определение

Предоставляет управление параллелизмом для классов, поддерживающих асинхронные вызовы методов. Этот класс не может быть унаследован.

public ref class AsyncOperationManager abstract sealed
public static class AsyncOperationManager
type AsyncOperationManager = class
Public Class AsyncOperationManager
Наследование
AsyncOperationManager

Примеры

В следующем примере кода показано использование AsyncOperationManager класса для создания класса, поддерживающего асинхронные операции для любой модели приложения. В нем показано, как реализовать класс, который проверяет число, чтобы определить, является ли он простым. Этот расчет может занять много времени, поэтому он выполняется в отдельном потоке. Отчеты о ходе выполнения, добавочные результаты и уведомления о завершении обрабатываются классом AsyncOperation , что гарантирует, что обработчики событий клиента вызываются в соответствующем потоке или контексте.

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

// 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

Комментарии

Если классу необходимо обеспечить асинхронное поведение в соответствии с обзором асинхронных шаблонов на основе событий, вы столкнетесь с рядом проблем управления параллелизмом. Среди них необходимо убедиться, что обработчики событий вызываются в потоке или контексте, подходящем для модели приложения (например, Windows Forms приложениям, ASP.NET приложениям, консольным приложениям и т. д.). AsyncOperationManager предоставляет удобный способ создания класса, который выполняется правильно во всех моделях приложений, поддерживаемых платформой .NET Framework.

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

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

Свойства

Имя Описание
SynchronizationContext

Возвращает или задает контекст синхронизации для асинхронной операции.

Методы

Имя Описание
CreateOperation(Object)

Возвращает значение AsyncOperation для отслеживания длительности конкретной асинхронной операции.

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

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