c# - 将表达式从同步更改为异步
问题描述
我有以下表达式:
var rules = rules.OrderBy(rule => (int)rule.RuleType)
.FirstOrDefault( item => item.IsMatch(request.data))
?.Execute(request.data);
这段代码的作用 - 它需要一组规则(它们都实现相同的接口),
按升序对它们进行排序,然后调用每个规则实现的 IsMatch 函数 - 从任何 IsMatch 函数返回的第一个“真”将停止迭代并调用该Execute
函数。
如果全部返回 False,Execute
将不会被调用。
该rules
对象在开头(在 OrderBy 之后)是 a IOrderedEnumerable<IRule>
,后来更改为IEnumerable<IRule>
(类型 FirstOrDefault 返回)。
我正在重构我的一些代码,现在该isMatch
函数已更改为 Async 函数。
我正在使用.NET 472,发现命名空间中的FirstOrDefaultAsync
那个EntityFramework.DynamicLinq
只能在一种IQueryable
对象上调用。
一旦我将其更改为:
var rules = rules.OrderBy(rule => (int)rule.RuleType).ToList().AsQueryable()
.FirstOrDefaultAsync(async item => await item.IsMatchAsync(request.data))
?.Execute(request.data);
我收到一个错误,即接受布尔值的 FirstOrDefaultAsync 函数没有重载(或者在这种情况下是返回布尔值的 lambda)
所以我的问题是 - 如何将此代码更改为异步代码?
解决方案
使用库System.Linq.Async,并假设Rule
该类包含方法public Task<bool> IsMatchAsync(string arg)
和public Task ExecuteAsync(string arg)
:
var matchedRule = await rules.ToAsyncEnumerable()
.OrderBy(rule => (int)rule.RuleType)
.FirstOrDefaultAwaitAsync(async item => await item.IsMatchAsync(request.data));
if (matchedRule != null) await matchedRule.ExecuteAsync(request.data);
推荐阅读
- woocommerce - 如何为产品添加自定义价格而不是原始价格?
- javascript - 在使用 Angular 12 安装 Angular Material v12 时遇到问题。期望在浏览器中看到 angular-material-slider 但收到 404 错误代码
- grafana - 允许 Grafana 查看器创建静音
- javascript - 无法通过 fetch 添加新帖子
- python - I can't get the x-axis to work the way I want
- java - local dynamodb consumed read units
- html - Title tooltip of fixed positioned button immediately disappears in Firefox
- python - 由于 ImportError,pyuic5.bat 无法正常工作
- javascript - 使用JS在同一div中的其他元素之前插入元素
- node.js - 用于开发和运行新应用程序的 NodeJS 服务器 GUI 工具