none
一个诡异的多线程抛出的异常~欢迎多线程高手们给点意见。 RRS feed

  • 问题

  • 吾辈真的连为什么出这个错都不知道啊...

    下面的程序是这个问题的简化演示版,Console Application

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
     
    namespace ConsoleApplication6
    {
        class Program
        {
     
            static int[][] allData;
           static Thread[] ths;
            // the new programme
           static void  Main(string[] args)
            {
                Random rnd=new Random ();
                allData = new int[10][];
                for (int i = 0; i < 10; i++)
                {
                    allData[i] = new int[10];
                    for (int k = 0; k < 10; k++)
                    {
     
                        allData[i][k] = rnd.Next(200);
                    }
                }
     
                ths = new Thread[10];
                for (int i = 0; i < 10; i++)
                {
                    ths[i] = new Thread(new ThreadStart(() =>
                        {
                            int[] tempDara = allData[i];
                            double b=tempDara.Average();
                        }));
                }
     
                for (int i = 0; i < 10; i++)
                {
                    ths[i].Start();
                    //Why Exception Throw?!?!
                }
            }
        }
    }
    

    2011年12月15日 10:13

答案

  • 解决了

    和多线程无关,因为 lambda表达式记录的是变量,而不是变量的指

     

    修改一下就好了

     

    for (int i = 0; i < 10; i++)
                {
                    int inthreadIndex=i;
                    ths[inthreadIndex] = new Thread(new ThreadStart(() =>
                        {                         int[] tempDara = allData[inthreadIndex];
                            double b=tempDara.Average();                     }));             }

    • 已标记为答案 mibxue 2011年12月15日 13:33
    2011年12月15日 13:33

全部回复

  • 解决了

    和多线程无关,因为 lambda表达式记录的是变量,而不是变量的指

     

    修改一下就好了

     

    for (int i = 0; i < 10; i++)
                {
                    int inthreadIndex=i;
                    ths[inthreadIndex] = new Thread(new ThreadStart(() =>
                        {                         int[] tempDara = allData[inthreadIndex];
                            double b=tempDara.Average();                     }));             }

    • 已标记为答案 mibxue 2011年12月15日 13:33
    2011年12月15日 13:33
  • 更正一下。这是 Lambda 表达式的闭包问题。
    Mark Zhou
    2011年12月16日 9:32