c# – 命名为异步lambda函数
我想在一个函数中创建一个名为lambda的函数,这样我就可以在同一个函数中重复调用它.
我过去常常同步/没有任务 Func<string,bool> pingable = (url) => return pingtest(url); 但在这种情况下,我想将pingable函数作为一个任务调用,所以我需要一个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"))); 我用*标记的所有行都会产生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); 如何在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); 这已经使用了这里提出的解决方案. 解决方法
由于pingtest本身看起来是同步的,我假设您需要一个Task,以便该方法可以在不同的线程上运行.如果这是真的,你需要使用Task.Run将工作卸载到ThreadPool线程:
Func<string,Task<bool>> func = url => Task.Run(() => pingtest(url)); 为了完整性,如果pingtest是异步的(即pingtestAsync),则需要创建一个异步lambda表达式: Func<string,Task<bool>> func = async url => await pingtestAsync(url); 但是,因为在这种情况下pingtestAsync已经返回任务< bool>在添加另一层async或lambda表达式时没有任何意义.这就足够了: Func<string,Task<bool>> func = pingtestAsync; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |