2015-01-05 5 views
6

동일한 함수에서 나중에 반복적으로 호출 할 수 있도록 명명 된 람다 함수에서 함수를 만들고 싶습니다. async lambda function

나는

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

로하지만 작업으로 ping이 함수를 호출 할이 경우 작업없이/동 기적으로이 작업을 수행하는 데 사용, 그래서 작업의 반환 형식이 필요합니다.

이것은 내가 갇혀있는 곳입니다. 모든 들어

아래, 나는 점점 오전 컴파일 오류 : 나는 일반적으로 비록 함수를 선언 할 수 있지만, 나는이 작업으로 호출 할 수 없습니다

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

:

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

모든 라인에게 I를 * copymile 오류가 발생했습니다.

http://dotnetcodr.com/2014/01/17/getting-a-return-value-from-a-task-with-c/은 솔루션에 대한 힌트를 갖고있는 것 같지만 샘플에는 제공된 입력 매개 변수가 허용되지 않습니다. (샘플이 단순화에서 촬영 :


Task<int> task = new Task<int>(obj => { return obj + 1; }, 300); 
만들고 C#으로 명명 된 작업 람다 전화, 그리고 함수가 아닌 클래스 수준에 그들을 선언하고자하는 방법.

명명 된 람다를 여러 번 호출하려는 경우 (이 경우 여러 개의 URL). 당신이 코드를 요구하기 때문에/업데이트


편집 :

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

이 이미 여기에 제안 된 솔루션을 사용합니다.

+0

'pingtest'는 어떻게 보이나요? – i3arnon

+0

여기에 삽입하려는 내용이 간략하게 나와 있습니다. 1 분 안에 해결책과 함께 편집에 추가하겠습니다. –

답변

5

pingtest은 동기식으로 보이기 때문에 Task을 원하면 다른 스레드에서 실행될 것이라고 가정합니다. 그게 사실이라면 당신은 ThreadPool 스레드로 작업을 오프로드 Task.Run를 사용해야합니다 완성도를 들어


Func<string, Task<bool>> func = url => Task.Run(() => pingtest(url)); 
, pingtest가 있다면 async (즉 pingtestAsync) 당신이 async 람다 식 만들어야합니다 :

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

그러나이 경우 pingtestAsync이 이미 Task<bool>을 반환하기 때문에의 다른 레이어를 추가하는 것은 의미가 없습니다.또는 람다 식. 이것으로 충분합니다 :

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

첫 번째 코드 라인은 내가 원하는 것입니다. 나는 내가 Task.Run을 놓친다라고 생각한다."pingtest"는 샘플 코드를 줄이는 것입니다. 실제 코드를 인라인 할 것입니다. 많은 감사합니다! –