通过生成包含数字的随机任务来添加数字


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团队提供的线程安全的随机生成器。

在此处查看这篇文章:线程安全随机数生成

简而

最新更新