none
c#开启多个线程完成同一任务? RRS feed

  • 常规讨论

  •   我想问下,C#怎么开启多个线程完成一个任务,
     举个例子说吧,假如从一个数组中读取数据,如果开启一个线程去读,肯定慢,用的时间长,
     如果开启多个线程读,每个线程读取一部分,用的时间就短了。
    见过许多软件在完成一个任务时可以开启多个线程,并可以选择线程的数量,请问大家是怎么实现的,
    给我举个例子讲解下,谢谢
    努力+方法=成功
    2009年5月31日 8:40

全部回复

  • /// <summary>
        /// 如有 100W 个用户需要从某接口获取它的信息(如信用卡消费)
        /// </summary>
        class ThreadTest
        {
            private object fLockObject = new object();
            private int fThreadCount = 10; // 开启 10 个线程
            private int fSize = 500;       // 每次取 500 个用户去获取他们的信息
            private int StartIndex
            {
                get
                {
                    lock (fLockObject)
                    {
                        // 计算开始索引
                        //return 开始索引
                    }
                }
            }
    
            public void Start()
            {
                Thread[] fThreadArray = new Thread[fThreadCount];
                for (int i = 0; i < fThreadCount; i++)
                    fThreadArray[i] = new Thread(new ThreadStart(DoSomeThings));
                for (int i = 0; i < fThreadCount; i++)
                    fThreadArray[i].Start();
            }
    
            public void DoSomeThings()
            {
                while (true)
                {
                    try
                    {
                        int fStartIndex = StartIndex;
                        int fEndIndex = StartIndex + fSize;
                        // 读取数组从 fStartIndex 到 fEndIndex
                        //for(...)
                        //{
                        //    // 获取信息并保存到数据库
                        //}
                    }
                    catch (Exception e)
                    {
                        // 记录异常
                    }
                }
            }
        }

    知识改变命运,奋斗成就人生!
    2009年5月31日 10:00
    版主
  • X.X.Y你好,你能不能给个完整的例子,我还是有些不解,
    你的MSN多少,咱们讨论下
    我的2008xiangzhang@live.cn
    假如我对一个容量为1000的数组排序,我开启一个线程用的时间一定长,如果我开启多个线程那排序用的时间就少了

    努力+方法=成功
    2009年5月31日 10:26
  • 我觉得多线程不太适合给数组排序啊……可能会添加额外的代码以解决线程间数据同步的问题吧


    ~~~~~ 如果我的回复对您有所帮助,请您点击一下此回复右上角的“投票认定帖子内容有帮助” ~~~~~
    ~~~~~ 向着三颗奖牌出发!^______^ ~~~~~
    2009年5月31日 11:06
  • 你好!
         我感觉这个任务不适合分成多个线程来完成,可能会增加程序的复杂度(需要各个线程之间同步,和交换数据等),很有可能使任务执行的更慢!
    周雪峰
    2009年5月31日 11:16
    版主
  • 大家看看这个例子
    http://www.cnxinshe.com./ThreadSort.rar
    就明白意思了,


    努力+方法=成功
    2009年5月31日 13:33
  • 你好!
         我感觉这个任务不适合分成多个线程来完成,可能会增加程序的复杂度(需要各个线程之间同步,和交换数据等),很有可能使任务执行的更慢!
    周雪峰
    赞成
    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
    2009年5月31日 13:51
    版主
  • 看了一下源代码……虽然我不太懂C#……
    您这里用来排序的语句如下(目的是完成int数组的排序吧):

    for (int j = 0; j < valueArray.Length - 1; j++)
        {
            lock (typeof(Thread))
            {	/* If the left-hand side value is greater swap values*/
                if (valueArray[j] > valueArray[j + 1])
                {
                    int T = valueArray[j];
                    valueArray[j] = valueArray[j + 1];
                    valueArray[j + 1] = T;
                    swaped = true;
                }
            }
        }

    其中用来排序的语句全部用lock语句锁住了。也就是说,不论创建了多少线程,用来执行排序操作的永远只是一个线程而已。
    (而且个人感觉很多线程对同一数组同时执行Sort方法是不对的吧……)
    您的本意可能是利用多线程同时对数组的不同部分进行排序,或是利用多线程多占用CPU时间以达到提升速度的效果。
    但是实际上排序操作并不适合用多线程来操作,而且这部分代码会导致大量线程同时执行同一循环(同时伴随着很多的线程的创建和销毁),而只有一个线程可以真正地执行排序操作,其他线程被阻塞,最后的结果就是多花费了好几倍的时间……


    ~~~~~ 如果我的回复对您有所帮助,请您点击一下此回复右上角的“投票认定帖子内容有帮助” ~~~~~
    ~~~~~ 向着三颗奖牌出发!^______^ ~~~~~
    2009年5月31日 14:00