使用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造成压力,甚至可能使线程达到最大。我看不出有什么好处。
对于此场景中的最佳实践的任何反馈都将不胜感激。
没有好处。此代码将对可伸缩性产生负面影响,并且根本没有提供任何好处。
有人看到了好的一面,首先写了这篇文章,
不,对不起。
这只是一种效率较低的方法:
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上将工作排队到线程池。