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)
Параметры
Объект 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.
ArrayList BuildPrimeNumberList(
int numberToTest,
AsyncOperation asyncOp)
{
ArrayList primes = [];
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 int firstDivisor))
{
// Report to the client that a prime was found.
ProgressChangedEventArgs e = new CalculatePrimeProgressChangedEventArgs(
n,
(int)(n / (float)numberToTest * 100),
asyncOp.UserSuppliedState);
asyncOp.Post(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 класс.
Дополнительные сведения о реализации асинхронных классов см. в разделе "Реализация асинхронного шаблона на основе событий".