Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Task.Run()用于Linq-优化或瓶颈_C#_Asp.net_Multithreading_Linq_Task - Fatal编程技术网

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)查询,应该是异步的。简洁,但异步是:)