导航

C# 定时任务模拟,请求二十万数据

Posted on 2021-04-21 00:14  锋丶千韧  阅读(258)  评论(0编辑  收藏  举报

 

定时器请求二十万数据 最近遇到一个问题,api接口,因为数据内容转换处理。一页1万条数据处理速度3秒以上。假设二十万条数据,分页请求二十次,总共花费时间1分钟以上。

解决这个问题,我第一时间想到并发,但是因为并发压力的问题,这个方案被否定。

后面,我想到一个解决思路,就是通过定时任务来发送请求,来解决这个问题。

假设我定时每1秒钟去发送一次请求,总共花费时间半分钟以内完成任务,上模拟代码

    static void Main(string[] args)
    {
        List<Task> tasks = new List<Task>();
        bool b = true;
        var stop = Stopwatch.StartNew();
        while (b)
        {
            if (!b) break;
            var taskDelay = Task.Delay(1000);
            var task = RequestTask();
            //延迟1秒,在请求下一次任务
            var any = Task.WhenAny(taskDelay, task);
            tasks.Add(task);
            any.Wait();
            
            //如果任务提前完成
            if (any.Result== task)
            {
                if (i >= max)
                {
                    b = false;
                }
            }
            else
            {
                //通过延续任务,处理响应结果
                any.ContinueWith(t =>
                {
                    task.Wait();
                    //通过响应结果,来判断是否结束定时任务
                    if (i >= max)
                    {
                        b = false;
                    }
                });
            }
   
        }
        
        //等待还未结束的任务
        var taskWhen=  Task.WhenAll(tasks);
        taskWhen.Wait();
        stop.Stop();
        Console.WriteLine($"结束 {tasks.Count} {stop.ElapsedMilliseconds}");
        Console.ReadLine();
    }
    static int i = 0;
    static int max = 10;
    public static Task RequestTask()
    {
        return Task.Run(() =>
        {
            i++;
            var index = i;
            Console.WriteLine($"任务{index} 开始");
            Random random = new Random();
            //模拟请求所等待的时间
            int num = 500;
            if (i<max)
            {
                num = random.Next(3000, 3500);
            }
            Thread.Sleep(num);
            Console.WriteLine($"任务{index} 请求时间:{num}");
        });
    }