C# 无阻塞地执行更多工作任务。更好的是,它可以使用其他TPL数据流类组合在步骤管道中。如果您创建线程而不是任务,则可以将其IsBackground设置为false,以防止进程退出,直到该线程终止。(警告:这是一种很好的方法,可以让用户必须转到任务管理器来关闭有

C# 无阻塞地执行更多工作任务。更好的是,它可以使用其他TPL数据流类组合在步骤管道中。如果您创建线程而不是任务,则可以将其IsBackground设置为false,以防止进程退出,直到该线程终止。(警告:这是一种很好的方法,可以让用户必须转到任务管理器来关闭有,c#,.net,task,task-parallel-library,C#,.net,Task,Task Parallel Library,无阻塞地执行更多工作任务。更好的是,它可以使用其他TPL数据流类组合在步骤管道中。如果您创建线程而不是任务,则可以将其IsBackground设置为false,以防止进程退出,直到该线程终止。(警告:这是一种很好的方法,可以让用户必须转到任务管理器来关闭有故障的应用程序……但是,在Main()中等待所有任务完成也是如此)那么,您想做什么呢?使老式应用程序现代化,只是不要太多?在这种情况下,我支持马修:坚持用线。它甚至可能比任何混合怪物创造物更干净;DYou可以使用一个具有高DOP的ActionB


无阻塞地执行更多工作任务。更好的是,它可以使用其他TPL数据流类组合在步骤管道中。如果您创建
线程
而不是
任务
,则可以将其
IsBackground
设置为
false
,以防止进程退出,直到该线程终止。(警告:这是一种很好的方法,可以让用户必须转到任务管理器来关闭有故障的应用程序……但是,在Main()中等待所有任务完成也是如此)那么,您想做什么呢?使老式应用程序现代化,只是不要太多?在这种情况下,我支持马修:坚持用线。它甚至可能比任何混合怪物创造物更干净;DYou可以使用一个具有高DOP的
ActionBlock
来完成您想要的几行操作-高DOP将确保每条消息都有自己的工作任务:
var block=new ActionBlock(msg=>Process(msg),new ExecutionDataflowBlockOptions{MaxDegreeOfParallelism=99}.
等待它们将是两行代码-
block.Complete();Wait Completion();
在不理解为什么的情况下做某事不是一个好主意。在这种情况下,为什么
Task.WhenAll().Wait()
而不是
Task.WaitAll())
?为什么要编写这些代码而不是使用
线程池。QueueWorkItem
?为什么要使用显式锁定而不是
ConcurrentQueue
?ConcurrentQueue的问题是它是一个队列FIFO(先进先出)。我们需要能够在任何给定时间(当它终止时)从列表中删除任务因此,这就是列表中被锁定的原因。我不会不同意有上百种解决方案。我只是在做一些小的(不是根本性的)更改时给出了我的解决方案。如果你有更好的解决方案,请说明。@Vernou这是同一件事。你可以使用
Task.WaitAll(anys.ToArray())
。WaitAll将数组作为参数,但WhenAll是可枚举的(它更适合我)@Vernou坦率地说,如果你只想知道所有线程是否都已完成,最简单的方法就是在线程启动时增加信号量,在线程退出时减少信号量。最后,你可以检查计数以确保所有线程都已完成。无需排队。或者你可以使用
interlocted.increment
interlocted.Dec记住
在全局计数器上是的,根本不需要那种“任务队列”。OP正试图通过使用任务作为线程来“现代化”基于线程的代码。这行不通——TPL已经在内部使用池和工作队列。将池和队列置于池和队列之上只会使事情变得复杂