使用Task.Run()进行Linq优化或瓶颈

本文关键字:优化 Linq 进行 Task Run 使用 | 更新日期: 2023-09-27 18:13:23

我正在尝试优化一些旧项目,确保它们是"异步的",不会在更重的负载下崩溃。

我使用了下面代码片段的变体,不确定Task.Run是优化还是可能的瓶颈。这种方法在一些较大的表单中被大量使用。

public static Task<List<SelectListItem>> ToMultipleSelectListItems<T>(this List<T> items, Func<T, string> nameSelector, Func<T, Guid> valueSelector, List<Guid> selected, Func<T, string> orderBy)
{
    Task<List<SelectListItem>> selectList = Task.Run(() => items.OrderBy(orderBy).Select(item =>
                    new SelectListItem
                    {
                        Text = nameSelector(item),
                        Value = valueSelector(item).ToString(),
                        Selected = selected.Contains(valueSelector(item))
                    }).ToList());
    return selectList;
}

示例调用. .

model.Abilities = await (await Api.GetAbilities()).ToMultipleSelectListItems(
    x => x.Name, 
    x => x.Id, 
    model.Task.SelectedAbilitiesList, 
    x => x.OrderBy.ToString()
);
在我看来,当前线程在返回之前仍然需要等待新线程的响应。因此,在某些负载下,这可能会对CPU造成压力,甚至可能使线程达到最大。我看不出有什么好处。

对于此场景中的最佳实践的任何反馈都将不胜感激。

使用Task.Run()进行Linq优化或瓶颈

没有好处。此代码将对可伸缩性产生负面影响,并且根本没有提供任何好处。

有人看到了好的一面,首先写了这篇文章,

不,对不起。

这只是一种效率较低的方法:

public static List<SelectListItem> ToMultipleSelectListItems<T>(this List<T> items, Func<T, string> nameSelector, Func<T, Guid> valueSelector, List<Guid> selected, Func<T, string> orderBy)
{
  return items.OrderBy(orderBy).Select(item =>
      new SelectListItem
      {
          Text = nameSelector(item),
          Value = valueSelector(item).ToString(),
          Selected = selected.Contains(valueSelector(item))
      }).ToList());
}
model.Abilities = (await Api.GetAbilities()).ToMultipleSelectListItems(
    x => x.Name, 
    x => x.Id, 
    model.Task.SelectedAbilitiesList, 
    x => x.OrderBy.ToString()
);

对于这种情况下的最佳实践的任何反馈都将是非常感谢的。

以下是相关的最佳实践:"避免在asp.net上使用Task.Run"。引用我的介绍异步ASP。网络文章:

您可以通过等待Task来启动一些后台工作。逃跑,但这样做没有意义。实际上,这会干扰ASP,从而损害您的可伸缩性。. NET线程池启发式。如果您在ASP上有cpu限制的工作要做。. NET中,最好的方法是直接在请求线程上执行它。作为一般规则,不要在ASP.NET上将工作排队到线程池。