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.
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.
Дополнительные сведения о реализации асинхронных классов см. в статье Реализация асинхронного шаблона на основе событий.