for (int i = 0; i < 10; i++)
            {
                Thread thread = new Thread(new ThreadStart(delegate()
                {
Console.WriteLine(i.ToString());
                }));
                thread.Start();
            }
输出结果:
1
1
2
3
5
6
7
8
9
9
请给予正确的代码,谢谢

解决方案 »

  1.   

     class Program
        {
            private static int Total = 10;
            static void Main(string[] args)
            {            for (int i = 0; i < Total; i++)
                {
                    ThreadObj threadObj = new ThreadObj(i);
                    Thread thread = new Thread(new ThreadStart(threadObj.Write));
                    thread.Start();
                }            Console.Read();
            }
        
        }
        public class ThreadObj
        {
            private int i = 0;
            public ThreadObj(int i)
            {
                this.i = i;
            }
            public void Write()
            {
                Console.WriteLine(this.i.ToString());
            }
        }
      

  2.   

    不知道是不是你想要的结果,因为你的代码存在线程同步的问题,因为你主线程执行速度是很快的,但是对于i变量作用域的问题,也就是第一个线程获取到i的变量的时候是0,但是主线程循环第二次的时候,也就是i=1的时候,之前第一个线程还没有启动,但是由于变量i作用域的问题,这个时候第一个线程的i,被主线程循环到1的时候所重写,所以这个时候有可能第一个线程和第二个线程同时启动了,会有出现两个线程值一样的情况,我也不知道我说清楚没。
      

  3.   

    对,说得对。            for (int i = 0; i < 10; i++)
                {
                    var y = i;
                    Thread thread = new Thread(new ThreadStart(delegate()
                    {
                      
                        Console.WriteLine(y.ToString());
                    }));
                    thread.Start();
                }
      

  4.   

    不知道说的是不是这样,0-9 全部输出:  
    for (int i = 0; i < 10; i++)
                {
                    Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj)
                    {                    Console.WriteLine(((int)obj).ToString());
                    }));
                    thread.Start(i);
                }/*0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    请按任意键继续. . .*/
      

  5.   

    for (int i = 0; i < 10; i++)
    {
            Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj)
            {               Console.WriteLine(((int)obj).ToString());
             }));
             thread.Start(i);
             System.Threading.Thread.Sleep(0);//加个这个就好了,主线程松手,子线程才可立马启发!
    //楼主,你也可以在你的代码加入这个! }
      

  6.   

    for (int i = 0; i < 10; i++)
    {
      Thread thread = new Thread(new ParameterizedThreadStart(delegate(object obj)
      {  Console.WriteLine(((int)obj).ToString());
      }));
      thread.Start(i);
      System.Threading.Thread.Sleep(0);//加个这个就好了,主线程松手,子线程才可立马启发!
    //楼主,你也可以在你的代码加入这个! }
      

  7.   

    你确定你理解的Thread.Sleep(0)是这样子
      

  8.   

    在我要机器中,System.Threading.Thread.Sleep(10);//要调到10 才行
     System.Threading.Thread.Sleep(0);//0-9都是太小了,没有引起子线程触发,
      大家可以跟据自已的机器不同,把参数改大改小,调到合适为止!
      

  9.   

    那么直接写 Sleep(10000000000000)岂不更“正确”?毕竟这个程序delegate中没有干任何正事。如果真正地编程,必定要干正事。那个时候再等程序在用户那里乱七八糟、被用户骂死了之后再去“大家可以跟据自已的机器不同,把参数改大改小,调到合适为止!”那就更加不是正规地软件工程师该做的事情了。那还不如直接写 Sleep(10000000000000),这样可以保证“适合”更多在delegate中干正事的程序。
      

  10.   

    主线程松手?什么概念?那用一个lock不是更好?完全搞不懂for10条线程有什么意义?并发处理还要顺序执行?线程不是这样用的
      

  11.   

    lz这样写代码是很没意义的,在没有弄明白线程做什么,瓶颈在哪的前提下很容易不明就里的使用多线程,初次接触思维比较直线,给他个过程慢慢就明白了。另外:ls你说的我不知道你有没有认真研究,每一句说的还是要对学习者负责。
      

  12.   

    楼主,稍作改动就行,添加一个临时变量:
    for (int i = 0; i < 10; i++)
    {
        int count = i;
        Thread thread = new Thread(() => Console.WriteLine(count.ToString()));
        thread.Start();
    }
      

  13.   

    谢谢大家,程序成功执行,因为使用delegate()托管了其中的代码,代码在开始执行时i的值可能已经变化。导致不规则的遗漏和重复参数。
    所以新增一个新的变量index ,把i赋值给index ,托管代码使用index 就可以了。
    修改了2处,
     
    for (int i = 0; i < 10; i++)
                {
    int index = i; //分配新的内存空间,以免托管代码执行i变量时i值已变化
                    Thread thread = new Thread(new ThreadStart(delegate()
                    {
                    Console.WriteLine(index.ToString());
                    }));
                    thread.Start();
                }
    成功输出
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    输出顺序无所谓,没有遗漏和重复。