我希望能在一个函数内创建一个命名的 lambda 函数,以便之后在同一函数中多次调用它。
我曾经使用以下方式同步/无任务地完成这个过程:
我曾经使用以下方式同步/无任务地完成这个过程:
Func<string, bool> pingable = (url) => return pingtest(url);
但在这种情况下,我希望将可ping函数作为任务调用,因此需要返回类型为Task。
这就是我卡住的地方。
对于以下所有内容,我都会收到编译错误:
* 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")));
我标记了所有带*的行,它们都产生了编译错误。
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#中创建和调用命名的Task lambda表达式,并且我想将其声明在函数而不是类级别。
我希望使用命名lambda表达式来多次调用它(在这种情况下为多个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