Aszinkron modell
A Windows Web Services API legtöbb művelete szinkronizálva vagy aszinkron módon is elvégezhető. Ha szinkron módon szeretne meghívni egy függvényt, adjon át egy null értéket a WS_ASYNC_CONTEXT struktúrához. Ha meg szeretné adni, hogy egy függvény aszinkron módon is végrehajtható legyen, adjon át egy nem null WS_ASYNC_CONTEXT a függvénynek.
Aszinkron meghívás esetén a függvények szinkronban vagy aszinkron módon is befejeződhetnek. Ha a függvény szinkron módon fejeződik be, egy olyan értéket ad vissza, amely a végső sikerességet vagy hibát jelzi, és ez az érték mindig más, mint WS_S_ASYNC (lásd Windows Web Services visszatérési értékeket). A WS_S_ASYNCvisszatérési értéke azonban azt jelzi, hogy a függvény aszinkron módon fog befejeződni. Ha a függvény aszinkron módon fejeződik be, a rendszer visszahívást hív meg a művelet befejezésének jelzésére. Ez a visszahívás a végső sikerességet vagy hibaértéket jelzi. A visszahívás nem lesz meghívva, ha a művelet szinkron módon fejeződik be.
Aszinkron környezet létrehozásához inicializálja a visszahívási és callbackState mezőit a WS_ASYNC_CONTEXT struktúrában. A callbackState mező a felhasználó által megadott adatokra mutató mutató megadására szolgál, amelyet a WS_ASYNC_CALLBACK függvénynek ad át.
Az alábbi példa egy függvény aszinkron meghívását mutatja be úgy, hogy egy mutatót ad át egy WS_ASYNC_CONTEXT struktúrának, amely tartalmazza a visszahívást, és egy mutatót az állapotadatokhoz.
HRESULT ExampleAsyncFunction(WS_ASYNC_CONTEXT* asyncContext);
void ExampleAsyncFunction()
{
// Set up the WS_ASYNC_CONTEXT structure.
MyState* myState = ...; \\ Declare a pointer to user-defined data.
WS_ASYNC_CONTEXT asyncContext;
asyncContext.callback = MyCallback; \\ Set the callback.
asyncContext.callbackState = myState; \\ Set the pointer to the user-defined data.
// Start the asynchronous operation
HRESULT hr = SomeFunction(&asyncContext);
if (hr == WS_S_ASYNC)
{
// The operation is completing asynchronously. The callback is called
// when the operation is complete.
}
else
{
// The operation completed synchronously. The callback is not called.
}
}
void CALLBACK MyCallback(HRESULT hr, WS_CALLBACK_MODEL callbackModel, void* callbackState)
{
MyState* myState = (MyState*)callbackState;
// The operation completed asynchronously.
}
A WS_ASYNC_CONTEXT struktúrát az aszinkron függvény csak a függvényhívás időtartamára használja (az aszinkron művelet időtartamára nem), így biztonságosan deklarálhatja a veremen.
Ha a WS_ASYNC_CONTEXT struktúrán kívül más paramétereket is átad a rendszer egy aszinkron függvénynek mutatóként, és a függvény aszinkron módon fejeződik be, a hívó feladata, hogy a paraméterek által mutatott értékeket életben tartsa (nem szabadít fel), amíg az aszinkron visszahívás meg nem hívja.
Korlátozások vonatkoznak arra, hogy a visszahívás milyen műveleteket hajthat végre. További információ a lehetséges műveletekről: WS_CALLBACK_MODEL.
Ha aszinkron függvényt implementál, ne hívja meg a visszahívást ugyanazon a szálon, amelyet az aszinkron függvénynek nevezett, mielőtt az aszinkron függvény visszakerült a hívóhoz, mivel ez megzavarja az aszinkron modellt.
Ha olyan függvényt implementál, amely aszinkron műveletek sorozatát kell végrehajtania, fontolja meg a WsAsyncExecute segédfüggvény használatát.
Az Aszinkron függvény példa az aszinkron modellt követő függvények implementálását és felhasználását mutatja be.
Az aszinkron IO-művelet indítása rendszererőforrásokat használ fel. Ha elegendő IO-művelet indul el, a rendszer nem válaszolhat. Ennek megakadályozása érdekében az alkalmazásnak korlátoznia kell az aszinkron műveletek számát.
Az aszinkron modell a következő API-elemeket használja.
Visszahívási | Leírás |
---|---|
WS_ASYNC_CALLBACK | Az aszinkron modellel használt visszahívási függvény paramétere. |
WS_ASYNC_FUNCTION | A WsAsyncExecute a következő, aszinkron műveletek sorozatában meghívandó függvény megadására szolgál. |
Felsorolás | Leírás |
---|---|
WS_CALLBACK_MODEL | A visszahívások szálkezelésének viselkedését adja meg (például egy WS_ASYNC_CALLBACK). |
Funkció | Leírás |
---|---|
WsAsyncExecute | Meghív egy felhasználó által definiált visszahívást, amely aszinkron műveletet kezdeményezhet, és jelezhet egy függvényt, amelyet az aszinkron művelet befejezésekor kell meghívni. |
Szerkezet | Leírás |
---|---|
WS_ASYNC_CONTEXT | Megadja az aszinkron visszahívást és a felhasználó által megadott adatokra mutató mutatót, amelyet a rendszer átad az aszinkron visszahívásnak. |
WS_ASYNC_OPERATION | A WsAsyncExecute a következő, aszinkron műveletek sorozatában meghívandó függvény megadására szolgál. |
WS_ASYNC_STATE | WsAsyncExecute használja az aszinkron művelet állapotának kezelésére. |
Kapcsolódó témakörök