C# 线程池或任务工厂

C# 线程池或任务工厂,c#,multithreading,C#,Multithreading,我有可以获取请求的windows服务,我想在单独的线程中处理每个请求 我还想限制线程的数量,即最多5个线程 我想在关闭应用程序之前等待所有线程 最好的方法是什么 我所尝试的: for (int i = 0; i < 10; i++) { var i1 = i; Task.Factory.StartNew(() => RequestHandle(i1.ToString())).ContinueWith(t => C

我有可以获取请求的windows服务,我想在单独的线程中处理每个请求

我还想限制线程的数量,即最多5个线程

我想在关闭应用程序之前等待所有线程

最好的方法是什么

我所尝试的:

 for (int i = 0; i < 10; i++)
        {
            var i1 = i;
            Task.Factory.StartNew(() => RequestHandle(i1.ToString())).ContinueWith(t => Console.WriteLine("Done")); 

        }
        Task.WaitAll();//Not waiting actually for all threads, why?
for(int i=0;i<10;i++)
{
var i1=i;
Task.Factory.StartNew(()=>RequestHandle(i1.ToString()).ContinueWith(t=>Console.WriteLine(“完成”);
}
Task.WaitAll()//实际上没有等待所有线程,为什么?
这样我就可以限制影院的数量了

var事件=新的手动重置事件[10];
线程池.SetMaxThreads(5,5);
对于(int i=0;i<10;i++)
{
var i1=i;
ThreadPool.QueueUserWorkItem(x=>
{
测试(i1.ToString());
事件[i1]。集合();
});
}
WaitHandle.WaitAll(事件);
还有另一种实现方法吗?

Task.WaitAll()//实际上没有等待所有线程,为什么?
你必须做到以下几点

 List<Task> tasks =  new List<Task>(); 
 for (int i = 0; i < 10; i++)
        {

            var i1 = i;
          tasks.Add(Task.Factory.StartNew(() => RequestHandle(i1.ToString())).ContinueWith(t => Console.WriteLine("Done"))); 

        }
    Task.WaitAll(tasks);
List tasks=newlist();
对于(int i=0;i<10;i++)
{
var i1=i;
tasks.Add(Task.Factory.StartNew(()=>RequestHandle(i1.ToString())).ContinueWith(t=>Console.WriteLine(“完成”));
}
Task.WaitAll(任务);
我认为你应该区分任务和线程

任务不是线程任务只是对未来结果的承诺,即使有许多任务调度,您的代码也只能在一个线程上执行

线程是一个低级概念,如果你启动一个线程,你知道它将是一个单独的线程
我认为您的第一个实现足以确保所有代码都已执行,但您必须使用
Task.Run
而不是
Task.Factory.StartNew

这两种方法都应该有效,也不能保证每个操作将在不同的线程中运行(这是一件好事)。控制最大线程数是另一回事

您可以使用设置
线程池的最大线程数。请记住,此更改是全局性的,您只有一个
ThreadPool

默认值将使用线程池(除了在某些特定情况下,它可以在调用TAK的同一线程上内联运行TAK),因此更改
ThreadPool
的参数也会影响
任务

现在,请注意我说的是default
TaskScheduler
。您可以自己滚动,这将使您能够更好地控制任务的运行方式。不建议创建自定义的
任务调度器
(除非您确实需要它并且知道自己在做什么)


关于嵌入式问题:

Task.WaitAll()//实际上没有等待所有线程,为什么?


要正确调用,需要将要等待的任务作为参数传递。无法隐式地等待所有当前存在的任务,您需要告诉它您要等待哪些任务。

如何“获取请求”?这很重要。现在还不清楚你应该用游泳池。并且SetMaxThreads()是应用程序全局线程,您正在阻止线程派生助手线程。只要您键入
新线程()
,它就结束了;您的项目已经有遗留代码。C#Cookbook中的并发性,@StephenCleary-它也适用于
线程池
,…
线程池。SetMaxThreads
有一些限制(数量与内核数量有关,IIS可能会覆盖值,…)可能是更好的选择。
 List<Task> tasks =  new List<Task>(); 
 for (int i = 0; i < 10; i++)
        {

            var i1 = i;
          tasks.Add(Task.Factory.StartNew(() => RequestHandle(i1.ToString())).ContinueWith(t => Console.WriteLine("Done"))); 

        }
    Task.WaitAll(tasks);