C# .net-在select中异步/等待时的性能

C# .net-在select中异步/等待时的性能,c#,.net,performance,.net-core,async-await,C#,.net,Performance,.net Core,Async Await,我想知道为什么在一个特定的案例中,关于异步/等待的并行过程有一种“限制”。 例如,这段代码(在.net core 3.1上运行): 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统线程; 使用System.Threading.Tasks; 公共课程 { 异步静态任务主(字符串[]args) { WriteLine(“Before-”+DateTime.Now.ToLongTimeString()); var list=await(Ta

我想知道为什么在一个特定的案例中,关于异步/等待的并行过程有一种“限制”。 例如,这段代码(在.net core 3.1上运行):

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统线程;
使用System.Threading.Tasks;
公共课程
{
异步静态任务主(字符串[]args)
{
WriteLine(“Before-”+DateTime.Now.ToLongTimeString());
var list=await(Task.WhenAll((await GetList()).Select(async l=>new{Value=l,Text=await Wait(l)}));
WriteLine(“After-”+DateTime.Now.ToLongTimeString());
WriteLine(“Count-”+list.Count());
Console.ReadLine();
}
异步静态任务GetList()
{
IEnumerable list=可枚举范围(1,20);
返回等待任务。FromResult(列表);
}
异步静态任务等待(int索引)
{
Console.WriteLine(index+“-During-Before-”+DateTime.Now.ToLongTimeString());
等待任务。运行(()=>{
睡眠(5000);
});
Console.WriteLine(index+“-in-After-”+DateTime.Now.ToLongTimeString());
返回“ok”;
}
}
因此,我希望在同一时间内得到20个数组元素的处理,5秒钟后,释放所有元素并完成程序

以下是输出:

Before - 12:11:05
1 - During Before - 12:11:05
2 - During Before - 12:11:05
3 - During Before - 12:11:05
4 - During Before - 12:11:05
5 - During Before - 12:11:05
6 - During Before - 12:11:05
7 - During Before - 12:11:05 
8 - During Before - 12:11:05 
9 - During Before - 12:11:05 
10 - During Before - 12:11:05
11 - During Before - 12:11:05
12 - During Before - 12:11:05
13 - During Before - 12:11:05
14 - During Before - 12:11:05
15 - During Before - 12:11:05
16 - During Before - 12:11:05
17 - During Before - 12:11:05
18 - During Before - 12:11:05
19 - During Before - 12:11:05
20 - During Before - 12:11:05
1 - During After - 12:11:10
2 - During After - 12:11:10
4 - During After - 12:11:10
3 - During After - 12:11:10
7 - During After - 12:11:10
8 - During After - 12:11:10
6 - During After - 12:11:10
5 - During After - 12:11:10
9 - During After - 12:11:11
10 - During After - 12:11:12
11 - During After - 12:11:13
12 - During After - 12:11:14
13 - During After - 12:11:15
14 - During After - 12:11:15
15 - During After - 12:11:15
16 - During After - 12:11:15
18 - During After - 12:11:15
17 - During After - 12:11:15
19 - During After - 12:11:15
20 - During After - 12:11:15
After - 12:11:15
Count - 20
跑步需要10秒而不是5秒

在20分钟前一切都很好。如预期。
但在接下来的20个“中间-之后”,从9点到13点,每一根线都会每秒整理一次。
所以我猜在这段代码中有一些特定的东西,但我不明白:

(await GetList())。选择(async l=>new{Value=l,Text=await Wait(l)})

有人能解释一下吗?

线程池是解决这个问题的一个解决方案,能够以较少的限制启动这个过程。但事情还在那里。
但知道了这一点,就可以找到问题的答案:

在代码中,问题的根源是
任务。运行
,就像使用踏板池处理委托一样。

因此,直接使用内部方法或替换
任务。通过其他方法运行
来解决原始问题。

线程池是解决问题的一种方法,能够以较少的限制启动流程。但事情还在那里。
但知道了这一点,就可以找到问题的答案:

在代码中,问题的根源是
任务。运行
,就像使用踏板池处理委托一样。

因此,直接使用内部方法或替换
任务。通过其他方法运行
来解决原始问题。

我怀疑您只是看到了线程池扩展策略。您正在创建20个线程只是为了睡觉。将“睡眠”部分改为等待任务。延迟(5000)我怀疑您会看到您期望的结果。请尝试在程序开始时使用
ThreadPool.SetMinThreads(100,10)
配置线程池,以查看它是否有任何区别。你们都是对的。通过
SetMinThreads
文档,我更好地理解了线程限制的配置是如何工作的。多谢各位。:)你们中有人能给出答案吗?因此,我可以将其标记为已接受。:)您还应该阅读中的差异,它们不是相同的东西,我怀疑您只是看到了线程池扩展策略。您正在创建20个线程只是为了睡觉。将“睡眠”部分改为等待任务。延迟(5000)我怀疑您会看到您期望的结果。请尝试在程序开始时使用
ThreadPool.SetMinThreads(100,10)
配置线程池,以查看它是否有任何区别。你们都是对的。通过
SetMinThreads
文档,我更好地理解了线程限制的配置是如何工作的。多谢各位。:)你们中有人能给出答案吗?因此,我可以将其标记为已接受。:)你也应该了解这些不同之处,它们不是一回事