AsyncOperationManager.CreateOperation(Object) Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
AsyncOperation Egy adott aszinkron művelet időtartamának nyomon követésére szolgáló értéket ad vissza.
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
Paraméterek
- userSuppliedState
- Object
Egy objektum, amely egy ügyfélállapot egy részét, például egy tevékenységazonosítót társít egy adott aszinkron művelethez.
Válaszok
Egy AsyncOperation aszinkron metódushívás időtartamának nyomon követésére használható.
Példák
Az alábbi példakód bemutatja, CreateOperation hogyan hozhat létre egy System.ComponentModel.AsyncOperation aszinkron műveletek időtartamának nyomon követésére szolgáló módszert. Ez a példakód egy nagyobb, az AsyncOperationManager osztályhoz tartozó példa része.
// 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
Megjegyzések
A CreateOperation metódus egy System.ComponentModel.AsyncOperation adott aszinkron művelet időtartamának nyomon követésére és az alkalmazásmodell riasztására használható, amikor a művelet befejeződik. A művelet leállítása nélkül is közzéteheti az előrehaladási frissítéseket és a növekményes eredményeket. A System.ComponentModel.AsyncOperation rendszer helyesen telepíti ezeket a hívásokat az alkalmazásmodell megfelelő szálára vagy környezetére.
Ha olyan osztályt implementál, amely támogatja az eseményalapú aszinkron mintát, az osztálynak minden alkalommal meg kell hívnia CreateOperation a MethodNameAsync metódust. A metódusra irányuló hívásokat kezdeményező ügyfélalkalmazás a userSuppliedState paraméterrel egyedileg azonosíthatja az egyes hívásokat, hogy meg lehessen különböztetni az aszinkron művelet végrehajtása során felmerülő eseményeket.
Figyelmeztetés
Az ügyfélkódnak egyedi értéket kell adnia a userSuppliedState paraméterhez. A nem egyedi feladatazonosítók miatt előfordulhat, hogy a megvalósítás helytelenül jelenti az előrehaladást és más eseményeket. A kódnak meg kell keresnie egy nem egyedi tevékenységazonosítót, és ha észleli a rendszer, adjon meg egy System.ArgumentException hibát.
A kódnak nyomon kell követnie az összes System.ComponentModel.AsyncOperation visszaadott CreateOperation hibát, és az objektumot a megfelelő mögöttes aszinkron műveletben kell használnia a frissítések közzétételéhez és a művelet leállításához. Ez a nyomon követés olyan egyszerű lehet, mint a paraméter átadása a System.ComponentModel.AsyncOperation meghatalmazottak között. Kifinomultabb kialakítás esetén az osztály megtarthatja az objektumok gyűjteményét System.ComponentModel.AsyncOperation , objektumokat adhat hozzá a tevékenységek indításakor, és eltávolíthatja őket a tevékenységek befejezésekor vagy megszakításakor. Ez a módszer lehetővé teszi egyedi paraméterértékek keresését userSuppliedState , és ezt a módszert kell használnia több egyidejű meghívást támogató osztályok használatakor.
Az aszinkron osztályok implementálásával kapcsolatos további információkért lásd az eseményalapú aszinkron minta implementálását.