定时器请求二十万数据 最近遇到一个问题,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}");
});
}