2015-01-05 25 views
6

Voglio creare all'interno di una funzione una funzione lambda denominata, in modo da poterla richiamare più volte in seguito nella stessa funzione.denominata funzione lambda async

ho usato per fare questo in modo sincrono/senza compiti con

Func<string, bool> pingable = (url) => return pingtest(url); 

ma in questo caso voglio chiamare la funzione pingable come un compito, quindi avrei bisogno di un tipo di ritorno Task.

Questo è il punto in cui sono bloccato.

Per tutti al di sotto, che sto ottenendo gli errori di compilazione:

* Func<string, Task<bool>> pingable = (input) => { return pingtest(url); }; 
    * Task<bool> pingable = new Task<bool>((input) => { return pingtest(url); }); 

posso dichiarare la funzione normalmente, però, ma poi non riesco a chiamare come un compito:

Func<string, bool> pingable = (input) => { return pingtest(url); };  
    var tasks = new List<Task>(); 
    * tasks.Add(async new Task(ping("google.de"))); 

Tutte le linee di I contrassegnati con * producono errori di copmile.

http://dotnetcodr.com/2014/01/17/getting-a-return-value-from-a-task-with-c/ sembra avere un suggerimento per una soluzione, ma il campione non consente parametri di input non forniti. (Campione prelevato da lì e semplificato :)

Task<int> task = new Task<int>(obj => 
{ 
    return obj + 1; 
}, 300); 

Come creare e chiamare lambda Task denominati in C#, e vorrei dichiarare loro su una funzione piuttosto che a livello di classe.

Voglio il nome lambda per chiamarlo più volte (più url in questo caso).


Modifica/aggiornamento dal momento che lei ha chiesto per il codice:

Func<string, Task<bool>> ping = url => Task.Run(() => 
{ 
    try 
    { 
     Ping pinger = new Ping(); 
     PingReply reply = pinger.Send(url); 
     return reply.Status == IPStatus.Success; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
}); 

var tasks = new List<Task>(); 
tasks.Add(ping("andreas-reiff.de")); 
tasks.Add(ping("google.de")); 
Task.WaitAll(tasks.ToArray()); 
bool online = tasks.Select(task => ((Task<bool>)task).Result).Contains(true); 

Questo fa già uso della soluzione qui proposta.

+0

come appare "pingtest'? – i3arnon

+0

È qui solo una scorciatoia per ciò che voglio inserire. Lo aggiungerò in una modifica, combinata con la tua soluzione in un minuto. –

risposta

5

Poiché pingtest sembra essere sincrono, presumo che si desideri un Task in modo che il metodo venga eseguito su un thread diverso. Se questo è vero è necessario utilizzare Task.Run di scaricare il lavoro ad un ThreadPool discussione:

Func<string, Task<bool>> func = url => Task.Run(() => pingtest(url)); 

Per completezza, se pingtest era async (cioè pingtestAsync) si avrebbe bisogno di creare un'espressione async lambda:

Func<string, Task<bool>> func = async url => await pingtestAsync(url); 

Tuttavia, poiché in questo caso pingtestAsync già restituiscono un Task<bool> non ha senso aggiungere un altro strato di async o un'espressione lambda a tutti. Questo sarebbe sufficiente:

Func<string, Task<bool>> func = pingtestAsync; 
+0

La tua prima riga di codice è esattamente quello che voglio. Presumo di aver perso il Task.Run."pingtest" è solo per abbreviare il codice di esempio, inserirò il codice effettivo. Grazie molto! –

Problemi correlati