C#中每个对象的新线程

时间:2014-09-22 22:18:15

标签: c# multithreading

我有以下代码:

Thread[] threadArray= new Thread[3];
MyObject[] objectArray = new MyObject[3];
    for (int i = 0; i < 3; i++)
    {
      //Create new HotelSupplier object
      objectArray[i] = new MyObject();
      //Create array of threads and start a new thread for each HotelSupplier
      threadArray[i] = new Thread(new ThreadStart(objectArray[i].run));
      //Store the name of the thread
      threadArray[i].Name = i.ToString();
      //Start the thread
      threadArray[i].Start();
    }

我创建了3个对象和3个线程。所有对象都存储在一个数组中,所有的线程都存储在一个数组中。

MyObject中的run方法在min和max之间生成一个随机数

Random random = new Random();
double min = 50.00;
double max = 500.00;
double price =  random.NextDouble() * (max - min) + min;
Console.WriteLine("GENERATING PRICE: " + price);

我的输出:

GENERATING PRICE: 101.271334780041
GENERATING PRICE: 101.271334780041
GENERATING PRICE: 101.271334780041

我期待3个不同的随机数,而不是只有一个,因为我认为每个线程都会在不同的对象上运行。

我做错了什么,我对线程有什么不了解?

2 个答案:

答案 0 :(得分:1)

您的原始代码导致所有Random个实例都以相同的值播种。

解决此问题的最低影响方式是移动代码以创建Random

void Run()
{
    //...
    Random random = new Random();
    //...
}

Run方法之外并进入private static变量,因此它变为:

private static Random random = new Random();
void Run()
{
    //...
}

所以它只会在MyObject的所有实例中播种一次。

答案 1 :(得分:0)

这是因为Random用当前时间播种,但时间分辨率通常只有15ms。换句话说,你的三个随机发生器在相同的15ms帧内被初始化的几率非常高,它们都具有相同的种子,因此都会产生相同的值。

我建议你在初始线程上创建一个第一个随机生成器,产生三个随机值,并将它们用作其他线程的种子&#39;发电机。