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í.
Vrátí hodnotu AsyncOperation 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 sloužící k přidružení části stavu klienta, například ID úlohy, ke konkrétní asynchronní operaci.
Návraty
Který AsyncOperation můžete použít ke sledování doby trvání asynchronního volání 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 AsyncOperationManager pro třídu.
// 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",
"taskId");
}
userStateToLifetime[taskId] = asyncOp;
}
// Start the asynchronous operation.
WorkerEventHandler workerDelegate = new WorkerEventHandler(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í hodnotu System.ComponentModel.AsyncOperation , kterou můžete použít ke sledování doby trvání konkrétní asynchronní operace a k upozornění modelu aplikace po dokončení operace. Můžete ho také použít k publikování aktualizací průběhu a přírůstkových výsledků bez ukončení operace. Bude System.ComponentModel.AsyncOperation správně zařazovat tato volání do příslušného vlákna nebo kontextu pro model aplikace.
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á provádí volání metody, může použít userSuppliedState
parametr k jedinečné identifikaci každého volání, aby se odlišily události vyvolané během provádění asynchronní operace.
Upozornění
Kód klienta musí poskytnout jedinečnou hodnotu parametru userSuppliedState
. Ne jedinečné ID úkolů můžou způsobit, že implementace bude hlásit průběh a jiné události nesprávně. Váš kód by měl zkontrolovat id úkolu, které není jedinečné, a pokud je nějaké zjištěno, vyvolá System.ArgumentException se.
Váš kód by měl sledovat každou System.ComponentModel.AsyncOperation vrácenou službou CreateOperation a použít objekt v odpovídající podkladové 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 jako mezi delegáty. Ve složitějších návrzích může vaše třída udržovat kolekci System.ComponentModel.AsyncOperation 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 volání.
Další informace o implementaci asynchronních tříd najdete v tématu Implementace asynchronního vzoru založeného na událostech.