2015-01-05 6 views
6

Ich möchte innerhalb einer Funktion eine benannte Lambda-Funktion erstellen, so dass ich es später in der gleichen Funktion wiederholt aufrufen kann.benannt async Lambda-Funktion

ich verwendet, um dieses synchron mit

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

aber in diesem Fall habe ich ohne Aufgaben/tun möchten die pingable Funktion als eine Aufgabe nennen, so würde ich eine Aufgabe Rückgabetyp benötigen.

Hier ist ich stecken.

Für alle unten, erhalte ich kompilieren Fehler:

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

ich normalerweise obwohl die Funktion erklären kann, aber dann kann ich es nicht als Aufgabe nennen:

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

die Linien All I habe mit einem * Fehlercode erzeugt.

http://dotnetcodr.com/2014/01/17/getting-a-return-value-from-a-task-with-c/ scheint einen Hinweis auf eine Lösung zu haben, aber die Probe dort nicht für nicht angegebene Eingabeparameter zulassen. (Probe von dort entnommen und vereinfachen :)

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

Wie erstellen und den Namen Task-Lambda-Ausdrücke in C# anrufen, und ich mag sie auf einer Funktion erklären, anstatt Klassenstufe.

Ich möchte das Named Lambda, um es mehrmals zu nennen (mehrere URLs in diesem Fall).


bearbeiten/aktualisieren, da Sie für Code gefragt:

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); 

Diese bereits Verwendung der Lösung macht hier vorgeschlagen.

+0

wie sieht 'pingtest' aus? – i3arnon

+0

Es ist hier nur eine Kurzform für was ich einfügen möchte. Ich werde es in einer Bearbeitung hinzufügen, kombiniert mit Ihrer Lösung in einer Minute. –

Antwort

5

Da pingtest aussieht synchron zu sein, nehme ich an, Sie wollen ein Task, so dass die Methode auf einem anderen Thread ausgeführt werden würde. Wenn das stimmt müssen Sie Task.Run verwenden, um die Arbeit zu einem ThreadPool Faden abzuladen:

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

Für Vollständigkeit, wenn pingtest war async (dh pingtestAsync) Sie müßten einen async Lambda-Ausdruck erstellen:

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

jedoch in diesem Fall, da pingtestAsync bereits eine Task<bool> Rückkehr gibt es keinen Sinn, eine weitere Schicht vonin Hinzufügenoder ein Lambda-Ausdruck überhaupt. Das würde reichen:

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

Ihre erste Codezeile ist genau das, was ich will. Ich nehme an, ich habe die Task.Run verpasst."pingtest" ist nur um den Beispielcode zu verkürzen, ich werde den eigentlichen Code inline einbinden. Danke vielmals! –

Verwandte Themen