関数内に名前付きラムダ関数を作成したいので、後で同じ関数で繰り返し呼び出すことができます。という名前の非同期ラムダ関数
私は
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);
これは、すでにここで提案されたソリューションを使用しています。
'pingtest'はどのように見えますか? – i3arnon
ここには、挿入したいものの省略形があります。私は1分であなたのソリューションと組み合わせて編集でそれを追加します。 –