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


AsyncOperation.Post(SendOrPostCallback, Object) Метод

Определение

Вызывает делегата для потока или контекста, соответствующего модели приложения.

public:
 void Post(System::Threading::SendOrPostCallback ^ d, System::Object ^ arg);
public void Post (System.Threading.SendOrPostCallback d, object arg);
public void Post (System.Threading.SendOrPostCallback d, object? arg);
member this.Post : System.Threading.SendOrPostCallback * obj -> unit
Public Sub Post (d As SendOrPostCallback, arg As Object)

Параметры

d
SendOrPostCallback

Объект SendOrPostCallback, создающий оболочку делегата, который должен вызываться при завершении операции.

arg
Object

Аргумент для делегата, содержащегося в параметре d.

Исключения

Метод PostOperationCompleted(SendOrPostCallback, Object) уже был вызван ранее для этой задачи.

d имеет значение null.

Примеры

В следующем примере кода демонстрируется использование Post метода для создания отчетов о ходе выполнения и добавочных результатах асинхронной операции. Этот пример входит в состав более крупного примера использования класса System.ComponentModel.AsyncOperationManager.

// This method computes the list of prime numbers used by the
// IsPrime method.
private ArrayList BuildPrimeNumberList(
    int numberToTest,
    AsyncOperation asyncOp)
{
    ProgressChangedEventArgs e = null;
    ArrayList primes = new ArrayList();
    int firstDivisor;
    int n = 5;

    // Add the first prime numbers.
    primes.Add(2);
    primes.Add(3);

    // Do the work.
    while (n < numberToTest && 
           !TaskCanceled( asyncOp.UserSuppliedState ) )
    {
        if (IsPrime(primes, n, out firstDivisor))
        {
            // Report to the client that a prime was found.
            e = new CalculatePrimeProgressChangedEventArgs(
                n,
                (int)((float)n / (float)numberToTest * 100),
                asyncOp.UserSuppliedState);

            asyncOp.Post(this.onProgressReportDelegate, e);

            primes.Add(n);

            // Yield the rest of this time slice.
            Thread.Sleep(0);
        }

        // Skip even numbers.
        n += 2;
    }

    return primes;
}
' This method computes the list of prime numbers used by the
' IsPrime method.
Private Function BuildPrimeNumberList( _
    ByVal numberToTest As Integer, _
    ByVal asyncOp As AsyncOperation) As ArrayList

    Dim e As ProgressChangedEventArgs = Nothing
    Dim primes As New ArrayList
    Dim firstDivisor As Integer
    Dim n As Integer = 5

    ' Add the first prime numbers.
    primes.Add(2)
    primes.Add(3)

    ' Do the work.
    While n < numberToTest And _
        Not Me.TaskCanceled(asyncOp.UserSuppliedState)

        If IsPrime(primes, n, firstDivisor) Then
            ' Report to the client that you found a prime.
            e = New CalculatePrimeProgressChangedEventArgs( _
                n, _
                CSng(n) / CSng(numberToTest) * 100, _
                asyncOp.UserSuppliedState)

            asyncOp.Post(Me.onProgressReportDelegate, e)

            primes.Add(n)

            ' Yield the rest of this time slice.
            Thread.Sleep(0)
        End If

        ' Skip even numbers.
        n += 2

    End While

    Return primes

End Function

Комментарии

Метод Post вызывает делегат, заданный параметром , arg без окончания времени существования асинхронной операции.

Метод можно вызывать Post так часто, как вам нравится, в то время как время существования асинхронной операции не было завершено вызовом PostOperationCompletedметода . Метод можно использовать для передачи клиентам отчетов о ходе выполнения или промежуточных результатах.

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

Параметр arg следует использовать для передачи состояния делегату, упакованном параметром d . Это может быть ссылка на AsyncOperationобъект или System.ComponentModel.ProgressChangedEventArgs объект . Для предоставления дополнительного хранилища состояний может потребоваться создать собственный класс System.ComponentModel.ProgressChangedEventArgs .

Примечания для тех, кто наследует этот метод

Наследники должны сделать Post(SendOrPostCallback, Object) вызов асинхронным, чтобы поставщикам библиотек классов не нужно было беспокоиться о потенциальных переполнениях стека, если они предполагают асинхронность, но конкретная модель приложения будет синхронной.

Примечание. Консольные приложения не синхронизируют выполнение вызовов Post(SendOrPostCallback, Object) . Это может вызвать беспорядочное возникновение событий ProgressChanged. Если вы хотите получить сериализованное выполнение вызовов Post(SendOrPostCallback, Object), реализуйте и установите класс SynchronizationContext.

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

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

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