c#多线程——为什么两个线程调用同一个函数?

本文关键字:调用 线程 同一个 函数 两个 为什么 多线程 | 更新日期: 2023-09-27 17:49:33

我有一个2线程的c#代码。它调用print方法,但它总是有相同的时间。为什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace MultiThreading
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(new ThreadStart(new Program().print));
            Thread thread2 = new Thread(new ThreadStart(new Program().print));
            thread.Name = "Thread1";
            thread2.Name = "thread2";  
            thread.Start();
            thread2.Start();
        }
        public void print()
        {
            Random r = new Random();
            int time = r.Next(3000);
            System.Console.WriteLine(Thread.CurrentThread.Name + ", " + (double)time/1000 + " secs!");
            Thread.Sleep(time);           
        }
    }
}

我有两个线程,每个线程都有"print"委托。

print生成一个数字time what what time seconds.

threadthread2总是同时产生,如何解决?

c#多线程——为什么两个线程调用同一个函数?

您的困惑不是因为线程,而是因为随机数生成器。

MSDN显示:

随机数的生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而为每个新的Random实例产生不同的序列。

试着用这个替换你的新随机行,看看有什么不同。

Random r = new Random(Thread.CurrentThread.ManagedThreadId);

我刚刚添加了一个新的随机种子,以便每个线程获得不同的值。

Edit:代替ManagedThreadId,您可以使用您选择的任何其他值作为种子值。您需要确保从random对象中获得不同的随机数序列是不同的。至于为什么ManagedThreadId不是一个很好的选择,请参阅下面的评论。

你可以使用System.Threading.Thread.Sleep方法between来启动线程。

thread.Start();
System.Threading.Thread.Sleep(100);
thread2.Start();

我猜,问题是随机()方法的调用!尝试使用不同的种子与每个线程,否则你总是得到相同的随机数!

在线程启动前调用Randomize()。这将为您的随机函数生成新的种子!