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


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 BeginOperationNameutá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 BeginOperationNameaz 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