异步方法返回相同的值

dan*_*ich 2 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;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*mse 6

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

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

  • 正确,但是......要注意`System.Random`不是线程安全的,所以在多个线程池任务之间共享一个实例(通过`Task.Run`)并不是一个好主意. (2认同)
  • 缺乏线程安全可能会导致此类产生随机结果...哦,等待:P (2认同)