积极答复者
今天请教! Task 任务线程使用问题。

问题
-
class Program { static Semaphore sep = new Semaphore(10, 100);//控制并行最小线程数为10,最大100。 static void Main(string[] args) { for (int i = 0; i < 100; i++) { Task tk = Task.Factory.StartNew(ok,i); } } static void ok(object i) { sep.WaitOne();//自减信号量 Console.WriteLine("FOR:{0}",i); } }
貌似必没有执行完10个线程就结束了;请老师指点。
- 已编辑 JJAVEN 2012年9月19日 9:49
答案
-
楼主好:)
调用Release释放资源:
public class Program { static Semaphore sep = new Semaphore(10, 100);//控制并行最小线程数为10,最大100。 static void Main(string[] args) { for (int i = 0; i < 100; i++) { Task tk = Task.Factory.StartNew(ok, i); } } static void ok(object i) { sep.WaitOne();//自减信号量 Console.WriteLine("FOR:{0}", i); sep.Release(); } }
- 已建议为答案 Jason Dot WangModerator 2012年9月20日 7:52
- 已标记为答案 Jason Dot WangModerator 2012年9月27日 8:10
-
楼主好:)
调用Release释放资源:
public class Program { static Semaphore sep = new Semaphore(10, 100);//控制并行最小线程数为10,最大100。 static void Main(string[] args) { for (int i = 0; i < 100; i++) { Task tk = Task.Factory.StartNew(ok, i); } } static void ok(object i) { sep.WaitOne();//自减信号量 Console.WriteLine("FOR:{0}", i); sep.Release(); } }
楼上sep.Release() 这个也就是自增信号量,也就是细放之前所占用的线程。
以上解决方法可以使用Interlocked.Increment(ref numb); 原子操作自增,numb与线程数判断+ManualResetEvent 来判断线程是否完成。
有一个疑问就是,我昨天测试Task 发现ThreadPool.SetMaxThreads(100,100);竟然对Task的并发数有效。
知道Task也是属于线程池、后台线程,是从Thread,ThreadPool优法来的;但好像没有自已的并数量控制。
我使用ThreadPool.SetMaxThreads(100,100);来控制Task的并发数不知道对不对。
- 已标记为答案 Jason Dot WangModerator 2012年9月27日 8:10
全部回复
-
楼主好:)
调用Release释放资源:
public class Program { static Semaphore sep = new Semaphore(10, 100);//控制并行最小线程数为10,最大100。 static void Main(string[] args) { for (int i = 0; i < 100; i++) { Task tk = Task.Factory.StartNew(ok, i); } } static void ok(object i) { sep.WaitOne();//自减信号量 Console.WriteLine("FOR:{0}", i); sep.Release(); } }
- 已建议为答案 Jason Dot WangModerator 2012年9月20日 7:52
- 已标记为答案 Jason Dot WangModerator 2012年9月27日 8:10
-
楼主好:)
调用Release释放资源:
public class Program { static Semaphore sep = new Semaphore(10, 100);//控制并行最小线程数为10,最大100。 static void Main(string[] args) { for (int i = 0; i < 100; i++) { Task tk = Task.Factory.StartNew(ok, i); } } static void ok(object i) { sep.WaitOne();//自减信号量 Console.WriteLine("FOR:{0}", i); sep.Release(); } }
楼上sep.Release() 这个也就是自增信号量,也就是细放之前所占用的线程。
以上解决方法可以使用Interlocked.Increment(ref numb); 原子操作自增,numb与线程数判断+ManualResetEvent 来判断线程是否完成。
有一个疑问就是,我昨天测试Task 发现ThreadPool.SetMaxThreads(100,100);竟然对Task的并发数有效。
知道Task也是属于线程池、后台线程,是从Thread,ThreadPool优法来的;但好像没有自已的并数量控制。
我使用ThreadPool.SetMaxThreads(100,100);来控制Task的并发数不知道对不对。
- 已标记为答案 Jason Dot WangModerator 2012年9月27日 8:10