Dela via


Bestämma när händelsebaserat asynkront mönster ska implementeras

Det händelsebaserade asynkrona mönstret ger ett mönster för att exponera en klasss asynkrona beteende. Med introduktionen av det här mönstret definierar .NET två mönster för att exponera asynkront beteende: det asynkrona mönstret baserat på System.IAsyncResult gränssnittet och det händelsebaserade mönstret. Den här artikeln beskriver när det är lämpligt att implementera båda mönstren.

Mer information om asynkron programmering med gränssnittet finns i IAsyncResult Asynchronous Programming Model (APM).

Allmänna principer

I allmänhet bör du exponera asynkrona funktioner med hjälp av det händelsebaserade asynkrona mönstret när det är möjligt. Det finns dock vissa krav som det händelsebaserade mönstret inte kan uppfylla. I sådana fall kan du behöva implementera IAsyncResult mönstret utöver det händelsebaserade mönstret.

Kommentar

Det är ovanligt IAsyncResult att mönstret implementeras utan att det händelsebaserade mönstret också implementeras.

Riktlinjer

I följande lista beskrivs riktlinjerna för när du ska implementera händelsebaserat asynkront mönster:

  • Använd det händelsebaserade mönstret som standard-API för att exponera asynkront beteende för din klass.

  • Exponera inte IAsyncResult mönstret när din klass främst används i ett klientprogram, till exempel Windows Forms.

  • Exponera IAsyncResult bara mönstret när det är nödvändigt för att uppfylla dina krav. Kompatibilitet med ett befintligt API kan till exempel kräva att du exponerar IAsyncResult mönstret.

  • Exponera inte IAsyncResult mönstret utan att även exponera det händelsebaserade mönstret.

  • Om du måste exponera IAsyncResult mönstret gör du det som ett avancerat alternativ. Om du till exempel genererar ett proxyobjekt genererar du det händelsebaserade mönstret som standard, med ett alternativ för att generera IAsyncResult mönstret.

  • Skapa din händelsebaserade mönsterimplementering på din IAsyncResult mönsterimplementering.

  • Undvik att exponera både det händelsebaserade mönstret och IAsyncResult mönstret i samma klass. Exponera det händelsebaserade mönstret för klasser på "högre nivå" och IAsyncResult mönstret för klasser på "lägre nivå". Jämför till exempel det händelsebaserade mönstret på komponenten WebClient med IAsyncResult mönstret för HttpRequest klassen.

    • Exponera det händelsebaserade mönstret och IAsyncResult mönstret för samma klass när kompatibilitet kräver det. Om du till exempel redan har släppt ett API som använder IAsyncResult mönstret måste du behålla IAsyncResult mönstret för bakåtkompatibilitet.

    • Exponera det händelsebaserade mönstret och IAsyncResult mönstret i samma klass om den resulterande objektmodellkomplexiteten överväger fördelen med att separera implementeringarna. Det är bättre att exponera båda mönstren i en enda klass än att undvika att exponera det händelsebaserade mönstret.

    • Om du måste exponera både det händelsebaserade mönstret och IAsyncResult mönstret för en enskild klass använder du EditorBrowsableAttribute set för att Advanced markera mönsterimplementeringen IAsyncResult som en avancerad funktion. Detta indikerar att designmiljöer, till exempel Visual Studio IntelliSense, inte visar IAsyncResult egenskaper och metoder. Dessa egenskaper och metoder kan fortfarande användas fullt ut, men utvecklaren som arbetar med IntelliSense har en tydligare vy över API:et.

Kriterier för att exponera IAsyncResult-mönstret utöver det händelsebaserade mönstret

Även om det händelsebaserade asynkrona mönstret har många fördelar i de tidigare nämnda scenarierna, har det vissa nackdelar, som du bör vara medveten om om prestanda är ditt viktigaste krav.

Det finns tre scenarier som det händelsebaserade mönstret inte hanterar samt IAsyncResult mönstret:

Du kan hantera dessa scenarier med hjälp av det händelsebaserade mönstret, men det är mer besvärligt än att använda IAsyncResult mönstret.

Utvecklare använder IAsyncResult ofta mönstret för tjänster som vanligtvis har mycket höga prestandakrav. Till exempel är avsökningsscenariot för slutförande en högpresterande serverteknik.

Dessutom är det händelsebaserade mönstret mindre effektivt än IAsyncResult mönstret eftersom det skapar fler objekt, särskilt EventArgs, och eftersom det synkroniseras mellan trådar.

Följande lista visar några rekommendationer att följa om du bestämmer dig för att använda IAsyncResult mönstret:

  • Exponera IAsyncResult endast mönstret när du specifikt behöver stöd för WaitHandle eller IAsyncResult objekt.

  • Exponera IAsyncResult bara mönstret när du har ett befintligt API som använder IAsyncResult mönstret.

  • Om du har ett befintligt API baserat på IAsyncResult mönstret kan du överväga att även exponera det händelsebaserade mönstret i nästa version.

  • Exponera IAsyncResult endast mönster om du har höga prestandakrav som du har verifierat inte kan uppfyllas av det händelsebaserade mönstret, men kan uppfyllas av IAsyncResult mönstret.

Se även