C# 线程池或任务工厂
我有可以获取请求的windows服务,我想在单独的线程中处理每个请求 我还想限制线程的数量,即最多5个线程 我想在关闭应用程序之前等待所有线程 最好的方法是什么 我所尝试的: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
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
的参数也会影响任务
现在,请注意我说的是defaultTaskScheduler
。您可以自己滚动,这将使您能够更好地控制任务的运行方式。不建议创建自定义的任务调度器
(除非您确实需要它并且知道自己在做什么)
关于嵌入式问题:
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);