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

Комментарии

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

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

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

Свойства

SynchronizationContext

Получает или задает контекст синхронизации для асинхронной операции.

Методы

CreateOperation(Object)

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

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

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