TPL - установить Task в Thread.Sleep на долгое время - PullRequest
1 голос
/ 23 ноября 2011

У меня есть тест для использования .NET Task Parallel Library:

static void Main(string[] args)
{
    for(int i = 0; i < 1000; i++)
    {
        int n = i;
        Task.Factory.StartNew(() => TaskTest(n));
    }
}

static void TaskTest(int i)
{
    // Will sleep for a long time
    Thread.Sleep(TimeSpan.FromMinutes(i));
    // Do something here
}

В одном я не уверен: когда Thread.Sleep в приведенном выше коде выполнится, что произойдет?Я знаю, что он не будет занимать поток в ThreadPool, есть ли какой-то недостаток, если я установлю несколько задач в Thread.Sleep на очень долгое время, например, 24 часа?

1 Ответ

2 голосов
/ 23 ноября 2011

Это будет занимать поток в ThreadPool. Попробуйте запустить код, и вы обнаружите, что весь пул потоков занят ожидающими задачами. Применение:

        List<Task> tasks = new List<Task>();

        for (int i = 0; i < 1000; i++)
        {
            int n = i;
            tasks.Add(Task.Factory.StartNew(() => TaskTest(n)));
        }

        Task.WaitAll(tasks.ToArray());

проект ParallelExtensionsExtras содержит метод расширения для TaskFactory, называемый StartNewDelayed, в котором вы можете запланировать задачу. Смотри: http://geekswithblogs.net/JoshReuben/archive/2010/11/14/parallel-extensions-extras.aspx

...