C# 将Task.Run()用于Linq-优化或瓶颈
我正在尝试优化一些较旧的项目,确保它们“始终异步”,并且不会在较重的负载下崩溃 我使用了下面代码段的变体,不确定C# 将Task.Run()用于Linq-优化或瓶颈,c#,asp.net,multithreading,linq,task,C#,Asp.net,Multithreading,Linq,Task,我正在尝试优化一些较旧的项目,确保它们“始终异步”,并且不会在较重的负载下崩溃 我使用了下面代码段的变体,不确定Task.Run是优化还是可能的瓶颈。这种方法在一些较大的形式中得到了大量使用 public static Task<List<SelectListItem>> ToMultipleSelectListItems<T>(this List<T> items, Func<T, string> nameSelector, Func
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;
}
在我看来,当前线程在返回之前仍然需要等待新线程的响应。因此,在某些负载下,这可能会对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()
);
MultipleSelectListItems的公共静态列表(此列表项、Func nameSelector、Func valueSelector、选定列表、Func orderBy)
{
return items.OrderBy(OrderBy)。选择(item=>
新建SelectListItem
{
Text=名称选择器(项目),
Value=valueSelector(项).ToString(),
选定=选定。包含(值选择器(项目))
}).ToList());
}
model.Abilities=(wait Api.GetAbilities()).ToMultipleSelectListItems(
x=>x.Name,
x=>x.Id,
model.Task.selectedabilities列表,
x=>x.OrderBy.ToString()
);
如果您对这种情况下的最佳实践有任何反馈,我们将不胜感激
下面是相关的最佳实践:“避免任务。在ASP.NET上运行”。引用我的话:
您可以通过等待Task.Run开始一些后台工作,但这样做没有意义。事实上,这实际上会干扰ASP.NET线程池启发式,从而损害您的可伸缩性。如果在ASP.NET上有CPU限制的工作要做,最好的办法就是直接在请求线程上执行它。一般来说,不要将工作排队到ASP.NET上的线程池
没有好处。这段代码将对可伸缩性产生负面影响,根本没有任何好处
有人从一开始就看到了好处并写了这篇文章
不,对不起
这只是一种效率较低的方法:
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()
);
MultipleSelectListItems的公共静态列表(此列表项、Func nameSelector、Func valueSelector、选定列表、Func orderBy)
{
return items.OrderBy(OrderBy)。选择(item=>
新建SelectListItem
{
Text=名称选择器(项目),
Value=valueSelector(项).ToString(),
选定=选定。包含(值选择器(项目))
}).ToList());
}
model.Abilities=(wait Api.GetAbilities()).ToMultipleSelectListItems(
x=>x.Name,
x=>x.Id,
model.Task.selectedabilities列表,
x=>x.OrderBy.ToString()
);
如果您对这种情况下的最佳实践有任何反馈,我们将不胜感激
下面是相关的最佳实践:“避免任务。在ASP.NET上运行”。引用我的话:
您可以通过等待Task.Run开始一些后台工作,但这样做没有意义。事实上,这实际上会干扰ASP.NET线程池启发式,从而损害您的可伸缩性。如果在ASP.NET上有CPU限制的工作要做,最好的办法就是直接在请求线程上执行它。一般来说,不要将工作排队到ASP.NET上的线程池
我看不到有利的一面
那你当初为什么要这么做?除非您在winform或WPF应用程序中,并且希望从UI线程卸载工作,否则在这里使用任务没有意义whatsoever@KooKiz我问这个问题的原因是因为我不确定如果忽略它,是否会以某种方式阻碍“一路异步”,并可能产生其他一些问题。有人看到了好处,首先写了这篇文章,我想确保删除它是正确的。@Mackan:这是UI还是ASP.NET项目?@StephenCleary ASP.NET如果考虑到性能,你应该将所选的列表
替换为所选的哈希集
,所选的包含(值选择器(项)
将获得更好的性能。我看不出有什么好处
那么你为什么要首先这么做?除非你在winform或WPF应用程序中,并且你想从UI线程中卸载工作,否则在这里使用任务没有意义whatsoever@KooKiz我问这个问题的原因是因为我不确定,如果不考虑这一点,是否会有阻碍“一路异步”,并可能产生其他问题。有人看到了一个好处,首先写了这篇文章,我想确保删除它是正确的。@Mackan:这是UI还是ASP.NET项目?@StephenCleary ASP.NET如果考虑到性能,你应该用一个选择的哈希集替换选择的列表e> selected.Contains(valueSelector(item)
将获得更好的性能。好的,谢谢!我不确定开始的原因是因为我看到了一些关于“async linq”的评论,但我想这没什么好担心的,因为API调用是等待并首先执行的。@Mackan:没错。GetAbilities
我假设是一个真正的异步(基于EF6)查询,应该是异步的。简洁,但异步是:)好的,谢谢!我不确定开始的原因是因为我看到了一些关于“async linq”,但我想在我的情况下,这没什么好担心的,因为API调用是等待并首先执行的。@Mackan:没错。GetAbilities
我假设是一个真正的异步(基于EF6)查询,应该是异步的。简洁,但异步是:)