Quando implementare il modello asincrono basato su eventi

Il modello asincrono basato su eventi fornisce un modello per esporre il comportamento asincrono di una classe. Con l'introduzione di questo modello, .NET definisce due modelli per l'esposizione del comportamento asincrono: il modello asincrono basato sull'interfaccia System.IAsyncResult e il modello basato su eventi. Questo articolo illustra quando è appropriato implementare entrambi i modelli.

Per altre informazioni sulla programmazione asincrona con l'interfaccia IAsyncResult, vedere Modello di programmazione asincrona (APM).

Principi generali

In generale, è consigliabile esporre le funzionalità asincrone usando il modello asincrono basato su eventi ogni volta che è possibile. Tuttavia, esistono alcuni requisiti che il modello basato su eventi non riesce a soddisfare. In questi casi, potrebbe essere necessario implementare il modello IAsyncResult oltre al modello basato su eventi.

Nota

È raro che il modello IAsyncResult venga implementato senza che venga implementato anche il modello basato su eventi.

Linee guida

L'elenco seguente illustra le linee guida che indicano quando è consigliabile implementare il modello asincrono basato su eventi:

  • Usare il modello basato su eventi come API predefinita per esporre il comportamento asincrono per la classe.

  • Non esporre il modello IAsyncResult quando la classe viene usata principalmente in un'applicazione client, ad esempio Windows Form.

  • Esporre il modello IAsyncResult solo quando è necessario per soddisfare i requisiti. Ad esempio, per la compatibilità con un'API esistente potrebbe essere necessario esporre il modello IAsyncResult.

  • Non esporre il modello IAsyncResult senza esporre anche il modello basato su eventi.

  • Se è necessario esporre il modello IAsyncResult, eseguire questa operazione come opzione avanzata. Se ad esempio si genera un oggetto proxy, generare il modello basato su eventi per impostazione predefinita, con un'opzione per generare il modello IAsyncResult.

  • Basare l'implementazione del modello basato su eventi sull'implementazione del modello IAsyncResult.

  • Evitare di esporre sia il modello basato su eventi che il modello IAsyncResult nella stessa classe. Esporre il modello basato su eventi nelle classi "di livello superiore" e il modello IAsyncResult nelle classi "livello inferiore". Confrontare, ad esempio, il modello basato su eventi nel componente WebClient con il modello IAsyncResult nella classe HttpRequest.

    • Esporre il modello basato su eventi e il modello IAsyncResult nella stessa classe quando è necessario per la compatibilità. Se ad esempio già stata rilasciata un'API che usa il modello IAsyncResult, sarà necessario mantenere il modello IAsyncResult per la compatibilità con le versioni precedenti.

    • Esporre il modello basato su eventi e il modello IAsyncResult nella stessa classe se la complessità del modello a oggetti risultante riduce il vantaggio offerto dalle implementazioni separate. È meglio esporre entrambi i modelli in una singola classe che evitare di esporre il modello basato su eventi.

    • Se è necessario esporre sia il modello basato su eventi che il modello IAsyncResult in una singola classe, usare EditorBrowsableAttribute impostato su Advanced per contrassegnare l'implementazione del modello IAsyncResult come funzionalità avanzata. Questo indica agli ambienti di progettazione, ad esempio Visual Studio IntelliSense, di non visualizzare le proprietà e i metodi IAsyncResult. Queste proprietà e metodi sono ancora completamente utilizzabili, ma lo sviluppatore che usa IntelliSense ha un quadro più chiaro dell'API.

Criteri per esporre il modello IAsyncResult oltre al modello basato su eventi

Anche se il modello asincrono basato su eventi offre numerosi vantaggi negli scenari indicati prima, presenta tuttavia alcuni svantaggi, di cui è meglio essere a conoscenza se le prestazioni sono il requisito più importante.

Esistono tre scenari che non contemplano il modello basato su eventi oltre al modello IAsyncResult:

È possibile gestire questi scenari usando il modello basato su eventi, che è tuttavia più complesso che usare il modello IAsyncResult.

Gli sviluppatori usano spesso il modello IAsyncResult per i servizi che in genere presentano requisiti di prestazioni molto elevate. Ad esempio, lo scenario del polling del completamento è una tecnica per i server con prestazioni elevate.

Il modello basato su eventi è anche meno efficiente del modello IAsyncResult perché crea più oggetti, soprattutto EventArgs, ed esegue la sincronizzazione nei thread.

L'elenco seguente illustra alcuni consigli da seguire se si decide di usare il modello IAsyncResult:

  • Esporre il modello IAsyncResult solo quando è necessario supporto specifico per gli oggetti WaitHandle o IAsyncResult.

  • Esporre il modello IAsyncResult solo quando si ha un'API esistente che usa il modello IAsyncResult.

  • Se si ha un'API esistente basata sul modello IAsyncResult, considerare anche la possibilità di esporre il modello basato su eventi nella versione successiva.

  • Esporre il modello IAsyncResult solo se è stato verificato che i requisiti di prestazioni non possono essere soddisfatti dal modello basato su eventi, ma possono essere soddisfatti dal modello IAsyncResult.

Vedi anche