本帖最后由 sandy1231 于 2014-4-17 10:07 编辑
我有一个数组,里面大约有1000条数据要Post出去,想把这一千条数据分成10个线程,每个线程POST 100条。但是执行的时候有的线程重复读取这个数组了,所以造成很多数据都重复发送的问题,如果用lock语句的话,感觉和单线程没啥区别,请问怎么解决?
尝试了把1000条数据分成10个集合数组,但发现运行起来后 集合会报 “未将对象引用设置到对象的实例。”或者是 “超出数组界限”之类的错误。[C#] 纯文本查看 复制代码 static void Main(string[] args)
{
Thread[] t = new Thread[10];
ArrayList list = new ArrayList();
ArrayList[] temp = new ArrayList[10];
for (int i = 0; i < 1000; i++)
{
list.Add(i.ToString());
}
for (int i = 0; i < 10; i++)
{
temp[i][i] = [/i]new ArrayList();
for (int j = 0; j < 100; j++)
{
temp.Add(list[j]);
}
list.RemoveRange(0, 99);
t = new Thread(new ThreadStart(delegate
{
for (int k = 0; k < temp.Count; k++)
{
TestFor(temp[i][k].ToString());
}
}
));
t.Name = i.ToString();
t.Start();
Thread.Sleep(1000);
}
}
public static void TestFor(string value)
{
Console.WriteLine("这是线程"+Thread.CurrentThread.Name+":"+value);
Thread.Sleep(10);
}
这里的代码会报 “未将对象引用设置到对象的实例。”或者是 “超出数组界限”之类的错误。 指向的错误是集合数组temp。
估计原因是:每循环开启一个线程后, 然后给数组赋值了,而正在运行的线程里的数组也会变成数组,因此被新值覆盖,所以出现了错误。
请问原因是这样么?
但我感觉如果是这样的话 有点不符合逻辑,线程1 调用的是 数组1,线程2 调用的是 数组2 ,循环一次后数组2的值变了 ,但为什么原先线程1里的数组1 也变数组2了?他们各自的值不是放到各自的堆栈里的吗?
后来我发现如果把方法TestFor里面做成循环,线程调用的时候直接传一个数组过去作为参数,而不是在线程里循环执行方法,这样上面的代码就不报错了,奇怪,有大神讲解下么?
[C#] 纯文本查看 复制代码 static void Main(string[] args)
{
Thread[] t = new Thread[10];
ArrayList list = new ArrayList();
ArrayList[] temp = new ArrayList[10];
for (int i = 0; i < 1000; i++)
{
list.Add(i.ToString());
}
for (int i = 0; i <t.Length; i++)
{
temp[i] = new ArrayList();
for (int j = 0; j < 100; j++)
{
temp.Add(list[j]);
}
list.RemoveRange(0, 99);
t = new Thread(new ThreadStart(delegate
{
TestFor(temp[i]);
}
));
t.Name = i.ToString();
t.Start();
Thread.Sleep(200);
}
Console.ReadKey();
}
public static void TestFor(ArrayList list)
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("这是线程" + Thread.CurrentThread.Name + ":" + list.ToString());
Thread.Sleep(10);
}
} |