我的ASP.NET MVC
网站中的计划任务每晚都会为用户发送通知。
我一直在发送和等待通知,但现在需要一个小时才能完成,所以我想我应该分批发送。
int counter = 0;
List<Task> tasks = new List<Task>();
foreach (var user in users)
{
tasks.Add(Task.Run(async () =>
{
await user.SendNotificationAsync();
counter++;
}));
if (tasks.Count >= 20)
{
await Task.WhenAll(tasks);
tasks.Clear();
}
}
if(tasks.Any())
{
await Task.WhenAll(tasks);
tasks.Clear();
}
但我已经知道在服务器上创建多个线程效率不高。我该如何在服务器上运行该方法的多个实例?
答案 0 :(得分:2)
因为你没有遵循TPL的最佳实践,所以在这里重写你应该怎么做:
List<Task> tasks = new List<Task>();
int counter = 0; // not sure what this is for
foreach (var user in users)
{
tasks.Add(user.SendNotificationAsync()); // do not create a wrapping task
counter++; // not sure about this either
// it won't ever be greater than 20
if (tasks.Count == 20)
{
await Task.WhenAll(tasks);
tasks.Clear();
}
}
if (tasks.Any())
{
await Task.WhenAll(tasks);
tasks.Clear();
}
这也很好,因为线程会在完成后立即生成和销毁。
答案 1 :(得分:1)
只是为了阐明Camilo的例子是什么,在你的例子中,你创建了一个新的Task
来监控你的等待任务。所以,基本上,你不仅要创建所需任务数量的两倍,而且还要将它们链接起来 - Task
来监视Task
,其中中间任务只是一个代理,它将被选中从Threadpool开始只是为了监视Threadpool中的另一个任务。
由于user.SendNotificationAsync()
是一项值得期待的任务,您可以直接将其添加到List<Task>
- 任务和await
上。
因此他的榜样。