命名异步 lambda 函数
named async lambda function
我想在一个函数中创建一个命名的 lambda 函数,以便以后可以在同一个函数中重复调用它。
我曾经和
一起完成这个synchronously/without任务
Func<string, bool> pingable = (url) => return pingtest(url);
但在这种情况下,我想将 pingable 函数作为任务调用,因此我需要任务 return 类型。
这就是我卡住的地方。
对于以下所有内容,我遇到了编译错误:
* 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# 中创建和调用命名任务 lambda,我想在函数而不是 class 级别上声明它们。
我想要命名的 lambda 以便多次调用它(在这种情况下是几个 url)。
Edit/update 因为你要求输入密码:
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
本身看起来是同步的,我假设您需要一个 Task
以便该方法将 运行 在不同的线程上。如果是这样,您需要使用 Task.Run
将工作卸载到 ThreadPool
线程:
Func<string, Task<bool>> func = url => Task.Run(() => pingtest(url));
为了完整性,如果 pingtest
是 async
(即 pingtestAsync
),您需要创建一个 async
lambda 表达式:
Func<string, Task<bool>> func = async url => await pingtestAsync(url);
但是,由于在这种情况下 pingtestAsync
已经 return 一个 Task<bool>
,所以添加另一层 async
或 lambda 表达式根本没有意义。这就足够了:
Func<string, Task<bool>> func = pingtestAsync;
我想在一个函数中创建一个命名的 lambda 函数,以便以后可以在同一个函数中重复调用它。
我曾经和
一起完成这个synchronously/without任务Func<string, bool> pingable = (url) => return pingtest(url);
但在这种情况下,我想将 pingable 函数作为任务调用,因此我需要任务 return 类型。
这就是我卡住的地方。
对于以下所有内容,我遇到了编译错误:
* 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# 中创建和调用命名任务 lambda,我想在函数而不是 class 级别上声明它们。
我想要命名的 lambda 以便多次调用它(在这种情况下是几个 url)。
Edit/update 因为你要求输入密码:
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
本身看起来是同步的,我假设您需要一个 Task
以便该方法将 运行 在不同的线程上。如果是这样,您需要使用 Task.Run
将工作卸载到 ThreadPool
线程:
Func<string, Task<bool>> func = url => Task.Run(() => pingtest(url));
为了完整性,如果 pingtest
是 async
(即 pingtestAsync
),您需要创建一个 async
lambda 表达式:
Func<string, Task<bool>> func = async url => await pingtestAsync(url);
但是,由于在这种情况下 pingtestAsync
已经 return 一个 Task<bool>
,所以添加另一层 async
或 lambda 表达式根本没有意义。这就足够了:
Func<string, Task<bool>> func = pingtestAsync;