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


Döntés az eseményalapú aszinkron minta implementálásáról

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: IAsyncResult Aszinkron 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 IAsyncResult eseményalapú minta mellett a mintát is implementálnia kell.

Feljegyzés

Ritkán fordul elő, hogy a IAsyncResult minta az eseményalapú minta nélkül is implementálható.

Irányelvek

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 hozza létre az eseményalapú mintát, a minta létrehozásához IAsyncResult pedig lehetőség van.

  • 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 az eseményalapú mintát és IAsyncResult a mintát is egy osztályon kell elérhetővé tennie, EditorBrowsableAttribute a készlettel Advanced speciális funkcióként jelölheti meg a IAsyncResult minta implementációját. 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 eseményalapú mintán kívül történő felfedésének feltételei

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ú minta három forgatókönyvet nem foglalkozik, valamint a IAsyncResult mintát:

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 WaitHandleIAsyncResult vagy objektumokat igényel.

  • 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.

Lásd még