如何有效地在ASP.NET MVC上运行多个线程?

时间:2017-10-23 00:39:59

标签: c# asp.net-mvc

我的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();
}

但我已经知道在服务器上创建多个线程效率不高。我该如何在服务器上运行该方法的多个实例?

2 个答案:

答案 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上。

因此他的榜样。