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 model aplikace.
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 po ukončení operace.
- arg
- Object
Argument delegáta obsaženého v parametru d
.
Výjimky
Metoda PostOperationCompleted(SendOrPostCallback, Object) byla pro tuto úlohu volána dříve.
d
je null
.
Příklady
Následující příklad kódu ukazuje použití Post metody pro hlášení průběhu a přírůstkových výsledků asynchronní operace. Tento příklad kódu je součástí většího příkladu System.ComponentModel.AsyncOperationManager pro třídu .
// 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
Poznámky
Metoda Post vyvolá delegáta určeného parametrem arg
bez ukončení životnosti asynchronní operace.
Můžete volat metodu Post 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í požadovaného delegáta, když chcete publikovat aktualizaci stavu asynchronní úlohy. Objekt AsyncOperation zajistí, že je 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á klienty upozorní na 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 AsyncOperationobjekt nebo objekt System.ComponentModel.ProgressChangedEventArgs . Za účelem poskytnutí dalšího úložiště stavu může být žádoucí odvodit vlastní třídu System.ComponentModel.ProgressChangedEventArgs .
Poznámky pro dědice
Dědíci musí učinit Post(SendOrPostCallback, Object) vyvolání asynchronní, aby se zprostředkovatelé 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 je synchronní.
Poznámka: Konzolové aplikace nesynchronizují provádění Post(SendOrPostCallback, Object) volání. To může způsobit ProgressChanged
, že události budou vyvolány mimo pořadí. Pokud chcete serializované spouštění Post(SendOrPostCallback, Object) volání, implementovat a nainstalovat SynchronizationContext třídu.
Další informace o implementaci asynchronních tříd najdete v tématu Implementace asynchronního vzoru založeného na událostech.