And*_*iff 6 .net c# lambda func async-await
我想在一个函数中创建一个名为lambda的函数,这样我就可以在同一个函数中重复调用它.
我过去常常同步/没有任务
Func<string, bool> pingable = (url) => return pingtest(url);
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我想将pingable函数作为一个任务调用,所以我需要一个Task返回类型.
这是我被困的地方.
对于以下所有,我收到编译错误:
* Func<string, Task<bool>> pingable = (input) => { return pingtest(url); };
* Task<bool> pingable = new Task<bool>((input) => { return pingtest(url); });
Run Code Online (Sandbox Code Playgroud)
我可以正常声明函数,但是我不能把它称为任务:
Func<string, bool> pingable = (input) => { return pingtest(url); };
var tasks = new List<Task>();
* tasks.Add(async new Task(ping("google.de")));
Run Code Online (Sandbox Code Playgroud)
我用*标记的所有行都会产生copmile错误.
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);
Run Code Online (Sandbox Code Playgroud)
如何在C#中创建和调用命名的任务lambdas,我想在函数而不是类级别声明它们.
我想要命名的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);
Run Code Online (Sandbox Code Playgroud)
这已经使用了这里提出的解决方案.
由于pingtest看起来本身是同步的,我假设你想要一个Task方法将在不同的线程上运行.如果这是真的,你需要Task.Run用来将工作卸载到一个ThreadPool线程:
Func<string, Task<bool>> func = url => Task.Run(() => pingtest(url));
Run Code Online (Sandbox Code Playgroud)
为了完整性,如果pingtest是async(即pingtestAsync)你需要创建一个asynclambda表达式:
Func<string, Task<bool>> func = async url => await pingtestAsync(url);
Run Code Online (Sandbox Code Playgroud)
但是,因为在这种情况下pingtestAsync已经返回了Task<bool>根本没有意义添加另一层async或一个lambda表达式.这就足够了:
Func<string, Task<bool>> func = pingtestAsync;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |