是否有多个Task.Run的开销在等待而没有返回? [关闭]

问题描述 投票:0回答:1

在创建的1000个任务中,假设taskCompletionSource在代码的其他部分成功完成,则只有很少(10)个任务可以完成。这意味着ProcessWorkItemAsync完成将仅打印10次。

code:

for (var i = 0;i<1000; i++)
{
     Task.Run(() => await ProcessWorkItemAsync()); 
     Console.WriteLine("ProcessWorkItemAsync finished");
}

async Task<TaskCompletionSource<int>> ProcessWorkItemAsync()
{
    return new TaskCompletionSource<int>();
}

是否有一项990任务的总费用未完成且处于困境?从我所读的内容来看,线程不会被阻塞,它将返回到线程拉,因此从CPU角度来看似乎没有任何开销。我还缺少什么?

由于存储了调用栈,是否存在内存开销,因为点网必须跟踪返回的位置?有什么方法可以检查控制台应用程序中哪些任务未完成且正在等待中?

c# async-await task-parallel-library
1个回答
-4
投票

一项任务是完成某些工作的承诺。

没有一项任务会无休止地无休止地在那里。

您可以运行长时间的任务,这些任务使用专用线程,但是它们并不处于混乱状态,并且如果它们实际上不得不await,则将删除所提供的专用线程,因为工作将继续进行。在另一个线程(将是线程池线程)上运行,除非您对用于计划工作的任务计划程序进行了大量修改,即,您创建了自己的计划程序来处理这种可能性。

[如果您要请求排队的任务数,例如要使用ConcurrentExclusiveTaskSchedulerPair来处理线程,则最多可以达到数千万,如果不是更多,我不确定它们到底要依靠什么。内存消耗似乎也很低,尽管如果您尝试施加这个数字,有时会开始看到疯狂分配4-5 GB RAM。 (过去我自己测试的数据。)


0
投票

一项任务是完成某些工作的承诺。

没有一项任务会无休止地无休止地在那里。

您可以运行长时间的任务,这些任务使用专用线程,但是它们并不处于混乱状态,并且如果它们实际上不得不await,则将删除所提供的专用线程,因为工作将继续进行。在另一个线程(将是线程池线程)上运行,除非您对用于计划工作的任务计划程序进行了大量修改,即,您创建了自己的计划程序来处理这种可能性。

[如果您要请求排队的任务数,例如要使用ConcurrentExclusiveTaskSchedulerPair来处理线程,则最多可以达到数千万,如果不是更多,我不确定它们到底要依靠什么。内存消耗似乎也很低,尽管如果您尝试施加这个数字,有时会开始看到疯狂分配4-5 GB RAM。 (过去我自己测试的数据。)

© www.soinside.com 2019 - 2024. All rights reserved.