2015-01-05 21 views
6

関数内に名前付きラムダ関数を作成したいので、後で同じ関数で繰り返し呼び出すことができます。という名前の非同期ラムダ関数

私は

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以下、私はコンパイルエラーを取得していますすべてのために

コピーミスエラーが発生しています。

http://dotnetcodr.com/2014/01/17/getting-a-return-value-from-a-task-with-c/は解決策にヒントがあるようですが、サンプルには入力パラメータが指定されていません。 (そこと簡略化から採取されたサンプル:) C#でタスクラムダという名前作成して呼び出す方法

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

、そして私は、機能ではなく、クラスレベルでそれらを宣言したいと思います。

名前を付けたラムダを複数回(この場合は複数の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)); 

pingtestasync(すなわち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"はサンプルコードを短縮するだけで、実際のコードをインライン展開します。どうもありがとう! –

関連する問題