2012-02-14 9 views
7

Sto imparando la programmazione asincrona usando C# e di solito uso BeginInvoke, ma non sono molto sicuro degli altri metodi di creazione di un'applicazione asincrona.Quanti modelli di sviluppo Asyncrono in .NET?

ho posto una domanda su questo, vedi sotto link per maggiori informazioni:

How to return T value from BeginInvoke?

Nel link qui sopra, Gravell ha detto che ci sono quattro modelli di sviluppo asincrono

c'è almeno 4, quindi - un normale callback (non APM, non EAP) non è raro

Ma Overflow ha detto che ci sono tre:

ci sono 3 modelli di sviluppo asincrona in .NET

  • APM - (BeginXXX/EndXXX), che si sta utilizzando questo, in cui la lunga corsa attività viene completata, si richiama nel codice nel metodo di EndXXX

  • EAP - evento base. In questo modello, al termine dell'attività a esecuzione prolungata, viene generato un evento per informare il codice.

  • TPL - Novità in. NET 4, questa è la versione basata su attività. Sembra più simile alla programmazione sincrona al codice client, utilizzando un'interfaccia fluente. Le sue chiamate al tuo codice usando ContinueWith.

Chiunque può aiutarmi in questo?

Ho cercato molto su google.com, ma in realtà usano più BeginInvoke. Grazie per l'aiuto.

risposta

3

Thread.Start - brutale

delegate.BeginInvoke/EndInvoke - 'vecchio' standard di

ThreadPool.QueueUserWorkItem - intelligente

TaskFactory.StartNew - l'unico modo per farlo corretto (secondo Patterns of parallel programming libro | vi consiglio di leggerlo prima per disambiguazione)

+0

Grazie per la risposta, che ne dici del modello basato su eventi? – CharlieShi

+1

@CharlieShi è solo uno schema macro che può essere fatto facilmente con uno di questi "metodi di creazione di operazioni asincroni". non importa quale sceglieresti. BTW in .NET 5 ci sarà un metodo unificato di creazione di metodi asincroni con parole chiave 'async/await' – Mikant

+0

quindi penso in .net 5, per noi è più facile gestire la funzione asincrona. Che ne dici di WPF? Lo sto imparando ora, non so se c'è un futuro brillante per impararlo. – CharlieShi

1

Sarà sicuramente utile imparare i metodi descritti da Mikant per lo sviluppo asincrono. Volevo solo darti un'idea di ciò che C# 5.0 sta riprogettando completamente come la lingua si occupa di async. Questo sarà il suo tema principale insieme all'introduzione di due nuove parole chiave, async e attendere. Basta richiamare l'attesa su un'attività a esecuzione prolungata e inizierà l'attività e restituirà il controllo al metodo di chiamata. Una volta completata l'attività, procede con il resto del codice.

Ecco un video eccellente per tutti i dettagli del suo utilizzo e spiegazione. Non descrive solo il vecchio modo di eseguire operazioni asincrone, ma una revisione completa del nuovo stile.Rende la scrittura di applicazioni asincrone più veloce e molto più leggibile con un flusso naturale.

Questo è il futuro del comportamento asincrono di C#, quindi vale la pena imparare.

http://channel9.msdn.com/events/PDC/PDC10/FT09/

+1

+1. Jon Skeet ha anche molte informazioni sulla nuova funzionalità 'async' nella sua serie di post sul blog" EduAsync ": http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx – CodingWithSpike

+0

@ rally25rs Thx for il sito Web che si consiglia, Applica molto il sito Web. – CharlieShi

1

C'è molto che possono essere catturati nel termine "sviluppo asincrono".


Per uno, si può desiderare di eseguire codice su un thread in background. Recentemente ho aggiornato uno blog post of mine confrontando diversi approcci comuni all'esecuzione del codice in background. Ecco l'elenco, in ordine dal più desiderabile almeno:

  1. Task (usati per asincrona/attendono).
  2. Task (come utilizzato dalla Libreria parallela attività).
  3. BackgroundWorker.
  4. Delegate.BeginInvoke.
  5. ThreadPool.QueueUserWorkItem.
  6. Thread

In un'altra parte, si potrebbe desiderare di rappresentare un'operazione asincrona (che può o non può essere vero codice in esecuzione su un thread in background). In questo caso, ci sono diversi approcci, in ordine dal più desiderabile almeno:

  1. Task (nello stile del Task-based Asynchronous Pattern (TAP))
  2. IAsyncResult con Begin*/End* metodi (che ha il nome infelice Asynchronous Programming Model (APM)).
  3. Un componente scritto utilizzando Event-based Asynchronous Pattern (EAP).

(Come nota a margine, BackgroundWorker è EAP, e Delegate.BeginInvoke è APM).


D'altro canto, si potrebbe dire programmazione asincrona in generale, che può essere interpretato a significare un approccio reattivo. In questo caso, ci sono solo due approcci che conosco:

  1. Reactive Extensions (Rx).
  2. Event-based Asynchronous Pattern (EAP).

Tuttavia, si potrebbe fare un caso che qualsiasi programma di event-driven è reattivo in una certa misura, in modo solo la gestione di eventi di interfaccia utente è un (semplice) sotto forma di "programmazione asincrona."


Inoltre, questi sono solo i modelli comuni. Qualsiasi piattaforma o libreria può aggiungere altro.Ecco alcuni fuori dalla parte superiore della mia testa:

  • La classe Socket ha una forma speciale di APM che può essere utilizzato per ridurre al minimo le allocazioni di memoria. Funziona in modo molto simile all'APM ma non si adatta allo schema.
  • Il runtime WinRT (in arrivo in Windows 8) ha le proprie rappresentazioni di operazioni asincrone (IAsyncOperation<TResult> e IAsyncInfo).
  • Windows Phone dispone di supporto specifico per un background agent, che consente di eseguire codice in background anche se l'app non è attualmente in esecuzione.
Problemi correlati