none
今天请教! Task 任务线程使用问题。 RRS feed

  • 问题

  • 
        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
    2012年9月19日 9:33

答案

  • 楼主好:)

    调用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();
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月20日 3:01
    版主
  • 楼主好:)

    调用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();
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    楼上sep.Release() 这个也就是自增信号量,也就是细放之前所占用的线程。

    以上解决方法可以使用Interlocked.Increment(ref numb); 原子操作自增,numb与线程数判断+ManualResetEvent 来判断线程是否完成。

    有一个疑问就是,我昨天测试Task 发现ThreadPool.SetMaxThreads(100,100);竟然对Task的并发数有效。

    知道Task也是属于线程池、后台线程,是从Thread,ThreadPool优法来的;但好像没有自已的并数量控制。

    我使用ThreadPool.SetMaxThreads(100,100);来控制Task的并发数不知道对不对。

    2012年9月20日 6:48

全部回复

  • 因为你的主线程已经执行完了. 如果你想看到所有的, 需要保证你的主线成不退出,

    最简单的方式是添加Console.Read()

    static void Main(string[] args)
                {
                    for (int i = 0; i < 100; i++)
                    {
                        Task tk = Task.Factory.StartNew(ok, i);
                    }
                    Console.Read();
                }


    Thanks! Damon.Tian

    2012年9月19日 11:26
  • 楼主好:)

    调用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();
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月20日 3:01
    版主
  • 楼主好:)

    调用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();
            }
        }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    楼上sep.Release() 这个也就是自增信号量,也就是细放之前所占用的线程。

    以上解决方法可以使用Interlocked.Increment(ref numb); 原子操作自增,numb与线程数判断+ManualResetEvent 来判断线程是否完成。

    有一个疑问就是,我昨天测试Task 发现ThreadPool.SetMaxThreads(100,100);竟然对Task的并发数有效。

    知道Task也是属于线程池、后台线程,是从Thread,ThreadPool优法来的;但好像没有自已的并数量控制。

    我使用ThreadPool.SetMaxThreads(100,100);来控制Task的并发数不知道对不对。

    2012年9月20日 6:48