Megosztás a következőn keresztül:


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.

 

példa aszinkron függvény

WS_ASYNC_CALLBACK

WS_ASYNC_CONTEXT

WS_CALLBACK_MODEL

WsAsyncExecute