Aszinkron programozási modell (APM)
A tervezési mintát használó IAsyncResult aszinkron művelet két elnevezett BeginOperationName
metódusként van implementálva, amelyek EndOperationName
az OperationName aszinkron művelet kezdetét és végét jelentik. Az osztály például FileStream a BeginRead fájlokból származó bájtok aszinkron beolvasására szolgáló metódusokat és EndRead metódusokat biztosít. Ezek a metódusok implementálják a metódus aszinkron verzióját Read .
Feljegyzés
A .NET-keretrendszer 4-től kezdve a Feladat párhuzamos kódtára új modellt biztosít az aszinkron és párhuzamos programozáshoz. További információ: Tevékenység párhuzamos kódtára (TPL) és tevékenységalapú aszinkron minta (TAP)).
A hívás BeginOperationName
után az alkalmazás folytathatja az utasítások végrehajtását a hívó szálon, miközben az aszinkron művelet egy másik szálon történik. Minden egyes híváshoz BeginOperationName
az alkalmazásnak is fel kell hívnia EndOperationName
a művelet eredményeit.
Aszinkron művelet megkezdése
A BeginOperationName
metódus elindítja az OperationName aszinkron műveletet, és visszaad egy objektumot, amely implementálja az interfésztIAsyncResult. IAsyncResult az objektumok egy aszinkron művelet adatait tárolják. Az alábbi táblázat az aszinkron művelettel kapcsolatos információkat mutatja be.
Tag | Leírás |
---|---|
AsyncState | Nem kötelező alkalmazásspecifikus objektum, amely az aszinkron művelettel kapcsolatos információkat tartalmazza. |
AsyncWaitHandle | Az WaitHandle aszinkron művelet befejezéséig az alkalmazás végrehajtásának letiltására használható. |
CompletedSynchronously | Egy érték, amely azt jelzi, hogy az aszinkron művelet befejeződött-e a híváshoz BeginOperationName használt szálon ahelyett, hogy külön ThreadPool szálon fejeződött be. |
IsCompleted | Egy érték, amely jelzi, hogy az aszinkron művelet befejeződött-e. |
A BeginOperationName
metódus a metódus szinkron verziójának aláírásával deklarált paramétereket veszi fel, amelyeket érték vagy hivatkozás alapján adnak át. A kimenő paraméterek nem részei a BeginOperationName
metódus-aláírásnak. A BeginOperationName
metódus-aláírás két további paramétert is tartalmaz. Ezek közül az első egy delegáltat AsyncCallback határoz meg, amely az aszinkron művelet befejezésekor meghívott metódusra hivatkozik. A hívó megadhatja null
(Nothing
a Visual Basicben), hogy nem szeretné-e meghívni a metódust a művelet befejezésekor. A második további paraméter egy felhasználó által definiált objektum. Ez az objektum alkalmazásspecifikus állapotinformációk továbbítására használható az aszinkron művelet befejezésekor meghívott metódusnak. Ha egy BeginOperationName
metódus további műveletspecifikus paramétereket, például bájttömböt használ a fájlból beolvasott bájtok tárolásához, a AsyncCallback metódus-aláírás utolsó paramétere az BeginOperationName
alkalmazásállapot-objektum.
BeginOperationName
azonnal visszaadja a vezérlőt a hívó szálnak. Ha a BeginOperationName
metódus kivételeket ad ki, a kivételek az aszinkron művelet elindítása előtt jelennek meg. Ha a BeginOperationName
metódus kivételeket ad vissza, a visszahívási metódus nem lesz meghívva.
Aszinkron művelet befejezése
A EndOperationName
metódus véget vet az OperationName aszinkron műveletnek. A metódus visszatérési EndOperationName
értéke megegyezik a szinkron megfelelője által visszaadott típussal, és az aszinkron műveletre jellemző. A metódus például a EndRead gazdaszámítógépről FileStream beolvasott bájtok számát adja vissza, a EndGetHostByName metódus pedig egy IPHostEntry gazdaszámítógép adatait tartalmazó objektumot ad vissza. A EndOperationName
metódus a metódus szinkron verziójának aláírásával deklarált kimenő vagy újraf paramétereket veszi fel. A szinkron metódus paraméterei mellett a EndOperationName
metódus egy paramétert IAsyncResult is tartalmaz. A hívóknak át kell adniuk a megfelelő hívás által visszaadott példányt.BeginOperationName
Ha az objektum által IAsyncResult képviselt aszinkron művelet meghíváskor EndOperationName
nem fejeződött be, EndOperationName
blokkolja a hívó szálat, amíg az aszinkron művelet be nem fejeződik. Az aszinkron művelet által kidobott kivételek a metódusból EndOperationName
származnak. A metódus többszöri meghívásának EndOperationName
hatása nem IAsyncResult definiálva. Hasonlóképpen, a EndOperationName
metódus meghívása IAsyncResult a kapcsolódó Begin metódus által nem visszaadott metódussal szintén nincs definiálva.
Feljegyzés
A nem definiált forgatókönyvek egyikében a implementátoroknak érdemes megfontolni a dobásokat InvalidOperationException.
Feljegyzés
A tervezési minta implementálóinak értesíteniük kell a hívót arról, hogy az aszinkron művelet true (igaz) értékre állítással IsCompleted befejeződött, meghívják az aszinkron visszahívási módszert (ha van megadva), és jelezik a AsyncWaitHandle.
Az alkalmazásfejlesztők számos tervezési lehetőség közül választhatnak az aszinkron művelet eredményeinek eléréséhez. A helyes választás attól függ, hogy az alkalmazás rendelkezik-e olyan utasításokkal, amelyek végrehajthatók a művelet végrehajtása közben. Ha egy alkalmazás nem tud további munkát végezni, amíg meg nem kapja az aszinkron művelet eredményeit, az alkalmazásnak blokkolnia kell, amíg az eredmények el nem érhetők. Ha egy aszinkron művelet befejezéséig szeretné letiltani a műveletet, az alábbi módszerek egyikét használhatja:
Hívás
EndOperationName
az alkalmazás fő száláról, amely blokkolja az alkalmazás végrehajtását a művelet befejezéséig. Ezt a technikát szemléltető példát az alkalmazásvégrehajtás blokkolása aszinkron művelet befejezésével című témakörben talál.Ezzel letilthatja az AsyncWaitHandle alkalmazás végrehajtását, amíg egy vagy több művelet be nem fejeződik. Ezt a technikát szemléltető példát az alkalmazásvégrehajtás blokkolása AsyncWaitHandle használatával című témakörben talál.
Azoknak az alkalmazásoknak, amelyeknek nem kell blokkolnia az aszinkron művelet befejeződése közben, az alábbi módszerek egyikét használhatják:
A művelet befejezési állapotának lekérdezése a IsCompleted tulajdonság rendszeres ellenőrzésével és a művelet befejezésekor történő hívással
EndOperationName
. Ezt a technikát szemléltető példát az aszinkron művelet állapotának lekérdezése című témakörben talál.AsyncCallback Delegált használatával megadhatja a művelet befejezésekor meghívandó metódust. Ezt a technikát szemléltető példa: Aszinkron művelet befejezése AsyncCallback delegált használatával.
Lásd még
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: