怎么多线程 多维数组赋值

如何多线程 多维数组赋值?
例如定义一个静态字符串多维数组

用线程一修改str[0,0]的值。。
用线程二修改str[1,0]的值。。
用线程三修改str[2,0]的值。。

static class Program
    {
public static string[,] str;
        static void Main()
        {
              for(int i=0;i<10;i++)
              {
             AA a=new AA(i,i.toString())
             Thread[] t=new Thread[10];
             t[i]=new Thread(a.cc)
             t[i].start()
              }
            Console.Writeline(str[2,0].toSring()); //这样后就出错未将对象引用设置到对象的实例。。。但如果这条在button另外执行是没错的,可能是多线程还没执行完就访问变量为null导致后来我加了还是一样
bool k = true;

                while (k)//等待str数组填充完毕
                {
                    for (int j = 0; j < n.Count; j++)
                    {
                        if (str[j, 0] == "")
                        {
                            k = true;
                        }
                        else
                        {
                            k = false;
                        }
                    }
                }



        }
    }



public class AA
{
   private int a;
   private string b;
  public AA(int aa,string bb)//构造函数
 {
    this.a=aa;
    this.b=bb;
 }
 public void cc()
{
  Program.str[a,0]=b;
}
}


搞到头大了都不知道到底是怎么回事。。。
------解决思路----------------------
哦,看错.
应该是public static string[,] str;你这个数组是静态的,只能初始化一次,不要在线程里初始化它
------解决思路----------------------
线程还没给数组赋值的时候就访问当然是null,你需要的是等待线程执行完成再访问,你写的那个while判断也不太对,就算写对了也不是应该的方式,这会让主线程忙等待,空耗cpu。这个看你的具体需求,是需要一个线程完成就取它负责的数据,还是等所有线程都完成取所有的数据。实现的方式有很多,要取决于具体的场景,比如线程里面的代码要执行多久,是不是需要考虑异步I/O,取数据来使用的代码是不是必须要在主线程完成,能不能让主线程等待工作线程等等。