首页 > 解决方案 > 将表达式从同步更改为异步

问题描述

我有以下表达式:

    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)

所以我的问题是 - 如何将此代码更改为异步代码?

标签: c#.netasynchronous

解决方案


使用库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);

推荐阅读