从异步方法返回相同的值
本文关键字:异步方法 返回 | 更新日期: 2023-09-27 18:08:41
我现在已经看瞎了自己,所以请帮助。
当我在循环中调用此方法两次时,它返回相同的值。为什么?
public async Task<int> RollDice() {
var rnd = new Random();
var selected = 0;
await Task.Run(() => {
selected = rnd.Next(1, 6);
});
return selected;
}
您必须在方法外部初始化Random
对象,以防止使用相同的种子一次又一次地初始化它,从而返回相同的值。
System.Random
类是不是线程安全的,不应该在单独线程中的任务之间共享。
您正在使用Random
类的两个实例。使用无参数构造函数,使用基于系统时钟的值作为随机数生成器的种子。
这意味着如果您创建两个Random
实例,它们将使用相同的值初始化,因为系统时钟具有有限的分辨率。具有相同的种子意味着这两个实例将产生相同的结果序列。
通过google搜索发现,使用Random
交叉线程可能会导致它中断并返回一个无穷无尽的零序列,因此,如果您必须多线程执行这部分代码,您可能需要查看这篇关于如何创建Random
类的单线程安全版本的文章。