首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >名为异步lambda函数

名为异步lambda函数
EN

Stack Overflow用户
提问于 2015-01-05 20:22:26
回答 1查看 1.1K关注 0票数 6

我希望在一个函数中创建一个名为lambda的函数,以便以后可以在同一个函数中重复调用它。

我过去常常同步/不带任务地执行这个任务。

代码语言:javascript
复制
Func<string, bool> pingable = (url) => return pingtest(url);

但是在这种情况下,我想将pingable函数作为一个任务调用,所以我需要一个task返回类型。

这就是我被困的地方。

对于下面的所有内容,我都会得到编译错误:

代码语言:javascript
复制
   * Func<string, Task<bool>> pingable = (input) => { return pingtest(url); };
   * Task<bool> pingable = new Task<bool>((input) => { return pingtest(url); });

不过,我可以正常声明函数,但不能将其称为任务:

代码语言:javascript
复制
   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/似乎对解决方案有一个提示,但是那里的示例不允许不提供输入参数。(抽取样本并加以简化:)

代码语言:javascript
复制
Task<int> task = new Task<int>(obj => 
{
    return obj + 1;
}, 300);

如何在C#中创建和调用命名任务lambda,我想在函数而不是类级别上声明它们。

我想要命名的lambda来多次调用它(在本例中是几个urls )。

编辑/更新,因为您要求的代码:

代码语言:javascript
复制
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);

这已经利用了这里提出的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-05 20:27:44

由于pingtest本身看起来是同步的,所以我假设您需要一个Task,以便该方法可以在不同的线程上运行。如果是这样的话,您需要使用Task.Run将工作卸载到ThreadPool线程:

代码语言:javascript
复制
Func<string, Task<bool>> func = url => Task.Run(() => pingtest(url));

为了完整起见,如果pingtestasync (即pingtestAsync),则需要创建一个async lambda表达式:

代码语言:javascript
复制
Func<string, Task<bool>> func = async url => await pingtestAsync(url);

但是,由于在本例中,pingtestAsync已经返回了一个Task<bool>,因此完全没有必要添加另一层async或lambda表达式。这就足够了:

代码语言:javascript
复制
Func<string, Task<bool>> func = pingtestAsync;
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27787280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档