异步方法返回相同的值

时间:2013-04-11 08:54:59

标签: c# random async-await

我现在已经盯着自己,所以请帮忙。

当我在循环内调用此方法两次时,它返回相同的值。为什么?

public async Task<int> RollDice() {
    var rnd = new Random();
    var selected = 0;

    await Task.Run(() => {
        selected = rnd.Next(1, 6);
        });

    return selected;
}

2 个答案:

答案 0 :(得分:6)

您必须在方法之外初始化Random对象,以防止使用相同的种子一次又一次地初始化它,从而返回相同的值。

重要的是要注意,正如LukeH在评论中正确添加的那样,System.Random线程安全,不应在单独的线程中的任务之间共享。

答案 1 :(得分:2)

您正在使用Random类的两个实例。使用parameterless constructor,随机数生成器使用基于系统时钟的值进行播种。

这意味着如果您在彼此之后不久创建两个Random个实例,它们将使用相同的值进行初始化,因为系统时钟具有有限的分辨率。拥有相同的种子意味着这两个实例将产生相同的结果序列。

一些谷歌搜索显示使用Random交叉线程会导致它断开并返回无穷无尽的零序列,所以如果你必须多线程代码的这个特定部分,你可能想看一下this article关于如何创建Random类的单个线程安全版本。