using System; using System.Threading; using System.Threading.Tasks;
namespaceMyApp { publicclassProgram { publicstaticvoidMain(string[] args) { // 使用 Random.Shared 属性创建一个新的 Random 实例 var random = Random.Shared;
// 创建两个新的 Task,分别用于生成伪随机数 var task1 = Task.Run(() => { // 生成伪随机数 for (int i = 0; i < 5; i++) { // 调用 Next 方法生成伪随机数 var number = random.Next(); // 输出当前线程的编号和生成的伪随机数 Console.WriteLine($"Thread1: {Thread.CurrentThread.ManagedThreadId}, number = {number}");
// 模拟耗时操作 Thread.Sleep(500); } }); var task2 = Task.Run(() => { // 生成伪随机数 for (int i = 0; i < 5; i++) { // 调用 Next 方法生成伪随机数 var number = random.Next();
// 输出当前线程的编号和生成的伪随机数 Console.WriteLine($"Thread2: {Thread.CurrentThread.ManagedThreadId}, number = {number}");
// 模拟耗时操作 Thread.Sleep(500); } });
// 等待两个 Task 完成 Task.WaitAll(task1, task2);
// 等待用户输入 Console.ReadKey(); } } }
在上面的代码中,我们使用 Random.Shared 属性创建了一个新的 Random 实例,然后在两个不同的线程中分别调用它的 Next 方法生成伪随机数。由于 Random.Shared 属性是线程安全的,所以两个线程之间的访问不会发生冲突,可以正常生成伪随机数。
原理说明
Random.Shared 属性返回的 Random 实例内部实际上使用了 [ThreadStatic] 属性,来实现对种子的线程安全访问。