Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az eseményalapú aszinkron minta egy osztály aszinkron viselkedésének feltárását szolgáló mintát biztosít. A minta bevezetésével a .NET két mintát határoz meg az aszinkron viselkedés feltárásához: az interfészen alapuló System.IAsyncResult aszinkron mintát és az eseményalapú mintát. Ez a cikk azt ismerteti, hogy mikor célszerű mindkét mintát implementálnia.
Az aszinkron programozási felülettel kapcsolatos további információkért lásd: IAsyncResultAszinkron programozási modell (APM).
Általános alapelvek
Általában az eseményalapú aszinkron mintával kell elérhetővé tenni az aszinkron szolgáltatásokat, amikor csak lehetséges. Vannak azonban olyan követelmények, amelyeket az eseményalapú minta nem tud teljesíteni. Ezekben az esetekben előfordulhat, hogy az eseményalapú minta mellett az IAsyncResult mintát is implementálnia kell.
Megjegyzés:
Ritkán fordul elő, hogy a IAsyncResult minta az eseményalapú minta nélkül is implementálható.
Iránymutatások
Az alábbi lista az eseményalapú aszinkron minta implementálásának irányelveit ismerteti:
Használja az eseményalapú mintát alapértelmezett API-ként az osztály aszinkron viselkedésének felfedéséhez.
Ne tegye közzé a IAsyncResult mintát, ha az osztályt elsősorban egy ügyfélalkalmazásban, például a Windows Formsban használják.
Csak akkor tegye közzé a IAsyncResult mintát, ha az a követelmények teljesítéséhez szükséges. Előfordulhat például, hogy a meglévő API-val való kompatibilitás megköveteli a minta megjelenítését IAsyncResult .
Ne tegye közzé a IAsyncResult mintát az eseményalapú minta felfedése nélkül.
Ha közzé kell tennie a IAsyncResult mintát, tegye ezt speciális beállításként. Ha például proxyobjektumot hoz létre, alapértelmezés szerint az eseményalapú mintát hozza létre, és IAsyncResult mintára is lehetőséget biztosít.
Hozza létre az eseményalapú minta implementációját a IAsyncResult minta implementációján.
Ne tárja fel az eseményalapú mintát és a IAsyncResult mintát ugyanazon az osztályon. Tegye közzé az eseményalapú mintát a "magasabb szintű" osztályokon, és az IAsyncResult "alacsonyabb szintű" osztályok mintáját. Hasonlítsa össze például az összetevő eseményalapú mintáját WebClient az IAsyncResult osztály mintájával HttpRequest .
Ha a kompatibilitás megköveteli, tegye közzé az eseményalapú mintát és a IAsyncResult mintát ugyanazon az osztályon. Ha például már kiadott egy, a IAsyncResult mintát használó API-t, akkor meg kell őriznie a mintát a IAsyncResult visszamenőleges kompatibilitás érdekében.
Tegye közzé az eseményalapú mintát és a IAsyncResult mintát ugyanazon az osztályon, ha az eredményül kapott objektummodell összetettsége meghaladja az implementációk elkülönítésének előnyeit. Jobb, ha mindkét mintát egyetlen osztályban teszi elérhetővé, mint az eseményalapú minta felfedésének elkerülése érdekében.
Ha mind az eseményalapú mintát, mind pedig a IAsyncResult mintát egy osztályban elérhetővé kell tenni, állítsa EditorBrowsableAttribute értékét Advanced-re, hogy a IAsyncResult minta implementációját fejlett funkcióként jelölje meg. Ez azt jelzi, hogy a tervezési környezetek, például a Visual Studio IntelliSense nem jeleníti meg a tulajdonságokat és a IAsyncResult metódusokat. Ezek a tulajdonságok és metódusok továbbra is teljes mértékben használhatók, de az IntelliSense-ben dolgozó fejlesztőnek világosabb az API-nézete.
Az IAsyncResult minta felfedésének kritériumai az eseményalapú mintán túl
Bár az eseményalapú aszinkron minta számos előnnyel rendelkezik a korábban említett forgatókönyvekben, vannak hátrányai, amelyeket érdemes figyelembe vennie, ha a teljesítmény a legfontosabb követelmény.
Az eseményalapú mintázat nem kezeli olyan jól a három forgatókönyvet, mint a IAsyncResult mintázat.
Várakozás blokkolása egyszerre IAsyncResult
Várakozás blokkolása számos IAsyncResult objektumon
Befejezés lekérdezése a következőn: IAsyncResult
Ezeket a forgatókönyveket az eseményalapú mintával kezelheti, de ez nehézkesebb, mint a IAsyncResult minta használata.
A fejlesztők gyakran használják a mintát olyan IAsyncResult szolgáltatásokhoz, amelyek általában nagyon magas teljesítményigényűek. A befejezési forgatókönyv lekérdezése például egy nagy teljesítményű kiszolgálói technika.
Emellett az eseményalapú minta kevésbé hatékony, mint a IAsyncResult minta, mivel több objektumot hoz létre, különösen EventArgsazért, mert szinkronizálja a szálakat.
Az alábbi lista néhány követendő javaslatot tartalmaz, ha a IAsyncResult minta használata mellett dönt:
Csak akkor tegye közzé a IAsyncResult mintát, ha kifejezetten támogatást igényel WaitHandle vagy IAsyncResult objektumokhoz.
Csak akkor tegye közzé a IAsyncResult mintát, ha már rendelkezik a mintát használó IAsyncResult API-val.
Ha a mintán IAsyncResult alapuló meglévő API-val rendelkezik, érdemes lehet az eseményalapú mintát is felfedni a következő kiadásban.
Csak akkor tegye közzé IAsyncResult a mintát, ha olyan nagy teljesítményű követelményekkel rendelkezik, amelyeket igazolt, nem tudja teljesíteni az eseményalapú minta, de a IAsyncResult minta képes megfelelni.