Eseményalapú aszinkron tervezési minta
Az eseményalapú aszinkron tervezési minta egy konkurens programtervezési minta. Lényege, hogy a hívó nem blokkolódik, amíg a hívott válaszára vár, hanem csinálhat mást. A hívó értesítést kap, ha megjön a válasz.
Háttere
szerkesztésA minta aszinkron hívásokat rendszerez, mivel a meghívott metódusok sokáig futhatnak.[1] Ekvivalens az Allan Vermeulen által 1996-ban leírt én tartozom neked mintával.[2][3]
A legtöbb programozási nyelvben az objektumhívás szinkron, tehát a hívó blokkolódik, ami különösen hátrányos, ha a hívás sokáig tart, és addig a hívó foglalkozhatna valami mással. Ebben az esetben lehet indítani egy dolgozó szálat, ahonnan a metódust meghívjuk. A legtöbb környezetben ehhez bőbeszédű kódszakasz és plusz adminisztráció szükséges. Ehhez képest az aszinkron hívás azonnal visszatér, további metódusok pedig megkönnyítik a hívó értesítését, vagy ha már nincs más tennivaló, és szükség van az eredményre, akkor a várakozást is.
Az aszinkron hívás egyik használata az aktív objektum tervminta. Alternatívája a szinkron metódushívás ígéret objektummal.[4] Ennek egy példája egy webböngésző, aminek azelőtt meg kell jelenítenie a weboldalakat, hogy a képek betöltődnének.
Megvalósításai
szerkesztésJava osztály
szerkesztésJavában a FutureTask osztály eseményeket használ a probléma megoldására.[5] Ez a változat több adminisztrációval jár, de hasznos szoftverkomponenseket reprezentáló objektumokhoz.
.NET keretrendszer
szerkesztés- Aszinkron programozási modell (APM) a .NET 2.0-ig[6]
- Eseményalapú aszinkron minta (EAP) a .Net 2.0-ban[7]
- Feladatalapú aszinkron tervezési minta (TAP) a .NET 4.0-ban[8]
Példa
szerkesztésA következő példa a minta laza értelmezésén alapul a .NET keretrendszerben.[9] Egy adott Accomplish metódushoz hozzá kell adni a BeginAccomplish és az EndAccomplish metódusokat.
class Example
{
Result Accomplish(args …)
IAsyncResult BeginAccomplish(args …)
Result EndAccomplish(IAsyncResult a)
…
}
A BeginAccomplish hívásakor a kliens azonnal visszakap egy AsyncResult objektumot, ami implementálja az IAsyncResult interfészt. A hívó közben valami mással foglalkozhat. Ha ezzel végzett, akkor meghívja az EndAccomplish metódust, átadva az előbb megkapott objektumot, ami már blokkolja a hívót, amíg nincs kész az eredmény.[10] Az AsyncResult objektumtól megkérdezhető, hogy fut-e még a hívott metódus:
interface IAsyncResult
{
bool HasCompleted()
…
}
Egy callback metódus is átadható a BeginAccomplish metódusnak, ami majd meghívódik, ha a hívott metódus véget ér. Ez tipikusan meghívja az EndAccomplish metódust, hogy megszerezze a végeredményt. Ezzel az a problémája, hogy mivel a dolgozó szálban hívódik meg, versenyhelyzetet okozhat.[11][12]
A .NET keretrendszerben az eseményalapú aszinkron minta egy alternatív API stílusra utal, ami a BeginAccomplish metódus helyett az AccomplishAsync metódust használja. Ezt a .NET 2.0-ban vezették be.[13][14] Ekkor a végeredmény automatikusan a callback metódushoz kerül. Az API speciális mechanizmust használ a callback metódus futtatására, hogy abban a szálban fusson, ami a BeginAccomplish metódust hívta. Ez megszünteti a versenyhelyzet lehetőségét, egyszerűsíti az API használatát, viszont több objektumot hoz létre, ami több időbe kerül.[15]
Jegyzetek
szerkesztés- ↑ Asynchronous Method Invocation. Distributed Programming with Ice. ZeroC, Inc.. [2008. január 5-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. november 22.)
- ↑ Vermeulen, Allan (1996. június 1.). „An Asynchronous Design Pattern”. Dr. Dobb's Journal. (Hozzáférés: 2008. november 22.)
- ↑ Nash, Trey. Threading in C#, Accelerated C# 2008. Apress (2007). ISBN 978-1-59059-873-3
- ↑ Lavender, R. Greg. „Active Object” (PDF). [2012. szeptember 24-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. november 22.)
- ↑ Class FutureTask. Oracle, 2011 (Hozzáférés: 2015. június 29.)[halott link]
- ↑ Asynchronous Programming Model. Microsoft, 2015 (Hozzáférés: 2015. június 29.)
- ↑ Event-based Asynchronous Pattern Overview. Microsoft, 2015 (Hozzáférés: 2015. június 29.)
- ↑ Task-based Asynchronous Pattern. Microsoft, 2015 (Hozzáférés: 2015. június 29.)
- ↑ Asynchronous Programming Design Patterns. .NET Framework Developer's Guide. Microsoft Developer Network. [2008. november 22-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. november 22.)
- ↑ Asynchronous Programming Overview. .NET Framework Developer's Guide. Microsoft Developer Network. [2008. december 7-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. november 22.)
- ↑ Using an AsyncCallback Delegate to End an Asynchronous Operation. .NET Framework Developer's Guide. Microsoft Developer Network. [2008. december 23-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. november 22.)
- ↑ Concurrency Issues. Distributed Programming with Ice. ZeroC, Inc.. [2008. március 28-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. november 22.)
- ↑ Event-based Asynchronous Pattern, Professional C# 2008. Wiley, 570–571. o. (2008)
- ↑ Multithreaded Programming with the Event-based Asynchronous Pattern. .NET Framework Developer's Guide. Microsoft Developer Network. [2008. december 25-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. november 22.)
- ↑ Deciding When to Implement the Event-based Asynchronous Pattern. .NET Framework Developer's Guide. Microsoft Developer Network. [2008. november 22-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. november 22.)
Fordítás
szerkesztésEz a szócikk részben vagy egészben az Asynchronous method invocation című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.