C# Task.Run中将单行Lambda改为块级Lambda的语法疑问
解决方案
块级Lambda(语句Lambda)和你之前用的单行表达式Lambda规则不同:表达式Lambda会自动将单行表达式的返回值作为委托返回值,语句Lambda必须显式写return返回目标结果,否则编译器无法匹配Task.Run所需的Func<ClearedOrdersReport>委托签名,就会报编译错误。
正确实现代码如下:
private Task<ClearedOrdersReport> listOrdersAwaitable(int a, int b) { Task<ClearedOrdersReport> t = Task.Run(() => { // 此处插入你需要新增的前置执行逻辑 // 例如参数校验、上下文初始化、日志打印等 YourCustomPreProcessLogic(); return listOrders(a, b); }); return t; }
额外注意事项
- 如果你的新增前置逻辑是异步方法,需要给Lambda加上
async关键字,内部用await等待异步操作完成,写法如下:
private Task<ClearedOrdersReport> listOrdersAwaitable(int a, int b) { Task<ClearedOrdersReport> t = Task.Run(async () => { // 异步前置逻辑示例:异步获取接口鉴权令牌 await GetAuthTokenAsync(); return await listOrders(a, b); }); return t; }
- 新增的前置逻辑必须写在
Task.Run的Lambda块内部,如果写在Task.Run外层,前置逻辑会在调用listOrdersAwaitable的原始线程执行,不会和listOrders一起跑在独立线程池线程上,不符合你的预期。 - 注意块级Lambda的大括号配对,不要遗漏括号、分号,否则也会触发编译报错。
内容的提问来源于stack exchange,提问作者geoffw123
相关产品推荐
相关产品推荐

