remove Compito<T> contro delegati asincroni in c#?




htmlagilitypack (2)

Il compito è più elegante ed è stato introdotto più di recente (.Net 4), quindi se soddisferà le tue esigenze, andrei con quello.

Ho questo semplice metodo:

static int Work (string s) { return s.Length; }

Potrei eseguirlo con:

Task<string> task = Task.Factory.StartNew<int> (() => Work ("lalala") );
...
int result = task.Result;

O con questo:

Func<string, int> method = Work;
IAsyncResult myIasync= method.BeginInvoke ("lalala", null, null);
...
int result = method.EndInvoke (myIasync);
  • Entrambi usano un thread threadpool.
  • Entrambi aspettano che l'esecuzione finisca (durante la lettura del valore)
  • Entrambi rilanciano qualsiasi eccezione al chiamante.

Quando dovrei usare ciascuno?


Il secondo modulo, utilizzando IAsyncResult , è significativamente più vecchio e molto meno potente. Task<T> stata introdotta in .NET 4 ed è il modo preferito di rappresentare le operazioni asincrone ora. È molto più semplice da usare, in particolare in C # 5 che supporta "funzioni asincrone" in cui è possibile attendere un'attività (o un'altra operazione asincrona) in modo non bloccante.

L'utilizzo di un'attività invece di chiamare BeginInvoke probabilmente non cambierà molto su come viene eseguita l'operazione stessa (sebbene fornisca più opzioni in termini di pianificazione, ecc.), Ma fa un'enorme differenza dalla prospettiva del codice che vuole " guardare "l'operazione, utilizzare i risultati, attendere più attività, gestire i guasti ecc.

Se è possibile utilizzare C # 5 (con .NET 4.5 o con .NET 4 più il pacchetto di targeting asincrono), la vita sarà notevolmente più semplice quando si gestiscono operazioni asincrone. È la strada da seguire :)







.net-4.0