public TestClass{
public Task<int> GetRandomNumber() {
return Task.FromResult(new Random().Next(0, 1500));
}
}
public class Default
{
static void Main(string[] args)
{
var test = new TestClass();
List<int> adddata = new List<int>();
for (int i = 0; i < 3; i++)
{
var result = Task.Run(() => test.GetRandomNumber());
Console.WriteLine("The values that will be added are :{0}", result.Result);
adddata.Add(result.Result);
}
Console.WriteLine("The value is :{0}", adddata.Sum(v => v));
}
}
问题是随机数返回相同的数字,68,68,122当它返回不同的数字时,我在做错了什么,我正在尝试学习如何在c#中使用任务。
,因为您每次都会生成一个新的Random
实例。创建一次Random
对象。由于Random
不是线程的安全,我们需要使用一个随机发电机,即:
public static class ThreadSafeRandom
{
private static Random global = new Random();
[ThreadStatic]
private static Random local;
public static int Next()
{
Random inst = local;
if (inst == null)
{
int seed;
lock (global)
{
seed = global.Next();
}
local = inst = new Random(seed);
}
return inst.Next();
}
}
现在消费:
public TestClass
{
public Task<int> GetRandomNumber()
{
return Task.FromResult(ThreadSafeRandom.Next());
}
}
编辑:
作为旁注,您正在在线程泵线程上执行您的委派,并立即与Result
同步阻止其。我假设您想做的是并行执行这些:
static void Main(string[] args)
{
var test = new TestClass();
Task<int>[] addData = Enumerable.Range(0, 4)
.Select(_ => Task.Run(() => test.GetRandomNumber()))
.ToArray();
Task.WaitAll(addData);
foreach (var result in addData)
{
Console.WriteLine("The values that will be added are :{0}", result.Result);
}
Console.WriteLine("The value is :{0}", adddata.Select(x => x.Result).Sum());
}
编辑2:
根据@chrisl正确指出Random
不是线程安全,我修改了使用PFX团队提供的线程安全的随机生成器。
在此处查看这篇文章:线程安全随机数生成
简而