AsyncOperationManager.CreateOperation(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í.
AsyncOperation Vrátí hodnotu pro sledování doby trvání konkrétní asynchronní operace.
public:
static System::ComponentModel::AsyncOperation ^ CreateOperation(System::Object ^ userSuppliedState);
public static System.ComponentModel.AsyncOperation CreateOperation(object userSuppliedState);
public static System.ComponentModel.AsyncOperation CreateOperation(object? userSuppliedState);
static member CreateOperation : obj -> System.ComponentModel.AsyncOperation
Public Shared Function CreateOperation (userSuppliedState As Object) As AsyncOperation
Parametry
- userSuppliedState
- Object
Objekt použitý k přidružení části stavu klienta, například ID úlohy, ke konkrétní asynchronní operaci.
Návraty
Můžete AsyncOperation použít ke sledování doby trvání vyvolání asynchronní metody.
Příklady
Následující příklad kódu ukazuje použití CreateOperation metody k vytvoření System.ComponentModel.AsyncOperation pro sledování doby trvání asynchronních operací. Tento příklad kódu je součástí většího příkladu uvedeného pro třídu AsyncOperationManager.
// This method starts an asynchronous calculation.
// First, it checks the supplied task ID for uniqueness.
// If taskId is unique, it creates a new WorkerEventHandler
// and calls its BeginInvoke method to start the calculation.
public virtual void CalculatePrimeAsync(
int numberToTest,
object taskId)
{
// Create an AsyncOperation for taskId.
AsyncOperation asyncOp =
AsyncOperationManager.CreateOperation(taskId);
// Multiple threads will access the task dictionary,
// so it must be locked to serialize access.
lock (userStateToLifetime.SyncRoot)
{
if (userStateToLifetime.Contains(taskId))
{
throw new ArgumentException(
"Task ID parameter must be unique",
nameof(taskId));
}
userStateToLifetime[taskId] = asyncOp;
}
// Start the asynchronous operation.
WorkerEventHandler workerDelegate = new(CalculateWorker);
_ = workerDelegate.BeginInvoke(
numberToTest,
asyncOp,
null,
null);
}
' This method starts an asynchronous calculation.
' First, it checks the supplied task ID for uniqueness.
' If taskId is unique, it creates a new WorkerEventHandler
' and calls its BeginInvoke method to start the calculation.
Public Overridable Sub CalculatePrimeAsync( _
ByVal numberToTest As Integer, _
ByVal taskId As Object)
' Create an AsyncOperation for taskId.
Dim asyncOp As AsyncOperation = _
AsyncOperationManager.CreateOperation(taskId)
' Multiple threads will access the task dictionary,
' so it must be locked to serialize access.
SyncLock userStateToLifetime.SyncRoot
If userStateToLifetime.Contains(taskId) Then
Throw New ArgumentException( _
"Task ID parameter must be unique", _
"taskId")
End If
userStateToLifetime(taskId) = asyncOp
End SyncLock
' Start the asynchronous operation.
Dim workerDelegate As New WorkerEventHandler( _
AddressOf CalculateWorker)
workerDelegate.BeginInvoke( _
numberToTest, _
asyncOp, _
Nothing, _
Nothing)
End Sub
Poznámky
Metoda CreateOperation vrátí metodu System.ComponentModel.AsyncOperation , kterou můžete použít ke sledování doby trvání konkrétní asynchronní operace a k upozorňování aplikačního modelu po dokončení operace. Můžete ho také použít k publikování probíhajících aktualizací a přírůstkových výsledků bez ukončení operace. Správně System.ComponentModel.AsyncOperation zařadí tato volání do příslušného vlákna nebo kontextu pro aplikační model.
Pokud implementujete třídu, která podporuje asynchronní vzor založený na událostech, vaše třída by měla volat CreateOperation pokaždé, když je volána metoda MethodNameAsync . Klientská aplikace, která volá metodu, může pomocí parametru userSuppliedState jednoznačně identifikovat každé vyvolání, aby bylo možné rozlišit události vyvolané během provádění asynchronní operace.
Caution
Klientský kód musí poskytnout jedinečnou hodnotu parametru userSuppliedState . Id ne jedinečných úkolů můžou způsobit, že vaše implementace hlásí průběh a jiné události nesprávně. Váš kód by měl zkontrolovat id úkolu, které není jedinečné, a vyvolat System.ArgumentException chybu, pokud je zjištěna.
Váš kód by měl sledovat všechny System.ComponentModel.AsyncOperation vrácené objekty CreateOperation a používat ho v odpovídající asynchronní operaci k publikování aktualizací a ukončení operace. Toto sledování může být stejně jednoduché jako předání parametru System.ComponentModel.AsyncOperation mezi delegáty. Ve složitějších System.ComponentModel.AsyncOperation návrzích může vaše třída udržovat kolekci objektů, přidávat objekty při spuštění úkolů a odebírat je při dokončení nebo zrušení úkolů. Tento přístup umožňuje zkontrolovat jedinečné userSuppliedState hodnoty parametrů a je to metoda, kterou byste měli použít při práci s třídami, které podporují více souběžných vyvolání.
Další informace o implementaci asynchronních tříd naleznete v tématu Implementace asynchronního vzoru založeného na událostech.