AsyncOperation.Post(SendOrPostCallback, Object) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Vyvolá delegáta ve vlákně nebo kontextu vhodném pro aplikační model.
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)
Parametry
Objekt SendOrPostCallback , který zabalí delegáta, který má být volána při ukončení operace.
- arg
- Object
Argument delegáta obsaženého v parametru d .
Výjimky
Metoda PostOperationCompleted(SendOrPostCallback, Object) byla volána dříve pro tuto úlohu.
d je null.
Příklady
Následující příklad kódu ukazuje použití Post metody pro generování sestav průběhu a přírůstkové výsledky asynchronní operace. Tento příklad kódu je součástí většího příkladu uvedeného pro třídu 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
Poznámky
Metoda Post vyvolá delegáta určeného arg parametrem bez ukončení životnosti asynchronní operace.
Metodu Post můžete volat tak často, jak chcete, zatímco životnost asynchronní operace nebyla ukončena voláním PostOperationCompleted. Metodu můžete použít k hlášení průběhu nebo průběžných výsledků zpět klientům.
Parametr d zabalí delegáta, kterého chcete volat, když chcete publikovat aktualizaci o stavu asynchronní úlohy. Objekt AsyncOperation zajistí, aby byl váš delegát vyvolán ve vlákně nebo kontextu vhodném pro aplikační model. Vaše metoda může volitelně vyvolat událost, která klientům oznámí změnu stavu, aktualizaci průběhu nebo nově dostupné přírůstkové výsledky.
Parametr arg by měl být použit k předání stavu delegátovi zabaleného parametrem d . Může se jednat o odkaz na objekt AsyncOperationnebo System.ComponentModel.ProgressChangedEventArgs objekt. K zajištění dalšího úložiště stavu může být žádoucí odvodit vlastní třídu System.ComponentModel.ProgressChangedEventArgs .
Poznámky pro dědice
Dědiče musí být Post(SendOrPostCallback, Object) vyvolání asynchronní, aby se poskytovatelé knihovny tříd nemuseli zabývat potenciálními přetečeními zásobníku, pokud předpokládají asynchrony, ale konkrétní aplikační model bude synchronní.
Poznámka: Konzolové aplikace nesynchronizují provádění Post(SendOrPostCallback, Object) volání. To může způsobit ProgressChanged vyvolání událostí mimo pořadí. Pokud chcete mít serializované provádění Post(SendOrPostCallback, Object) volání, implementujte a nainstalujte SynchronizationContext třídu.
Další informace o implementaci asynchronních tříd naleznete v tématu Implementace asynchronního vzoru založeného na událostech.