C#中每个对象的新线程

本文关键字:线程 新线程 对象 | 更新日期: 2023-09-27 18:23:54

我有以下代码:

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方法生成一个介于最小和最大之间的随机数

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个不同的随机数,而不是只有一个,因为我认为每个线程都会在不同的对象上运行。

我做错了什么,我不了解线程的哪些方面?

C#中每个对象的新线程

您的原始代码导致所有Random实例都使用相同的值进行种子设定。

修复此问题的最低影响方法是移动代码以创建Random:

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

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

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

因此它在CCD_ 5的所有实例上仅被播种一次。

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

我建议您在初始线程上创建第一个随机生成器,生成三个随机值,并将它们用作其他线程的生成器的种子。