【发布时间】:2016-10-15 22:37:38
【问题描述】:
我正在尝试优化一些旧项目,确保它们“一直异步”并且不会在较重的负载下崩溃。
我使用了以下 sn-p 的变体,但不确定 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 造成压力,甚至可能会最大化线程。我看不出有什么好处。
对于此场景中的最佳实践的任何反馈,我们将不胜感激。
【问题讨论】:
-
I fail to see an upside那你为什么要这样做呢?除非您使用的是 winform 或 WPF 应用程序,并且您想从 UI 线程中卸载工作,否则在这里使用任务毫无意义 -
@KooKiz 我问的原因是因为我不确定是否将其遗漏会以某种方式阻碍“一直异步”,并可能会产生其他问题。有人看到了好处并首先写了这个,我想确保删除它是正确的。
-
@Mackan:这是 UI 还是 ASP.NET 项目?
-
@StephenCleary ASP.NET
-
如果您考虑性能,您应该将
List<Guid> selected替换为HashSet<Guid> selected,selected.Contains(valueSelector(item)将获得更好的性能。
标签: c# asp.net multithreading linq task