Задача игнорирует Thread.Sleep - PullRequest
4 голосов
/ 29 октября 2010

пытается понять TPL.

Просто для удовольствия я попытался создать несколько задач со случайным сном, чтобы посмотреть, как они были обработаны. Я нацелился на огонь и забыл образец ..

static void Main(string[] args)
    {
        Console.WriteLine("Demonstrating a successful transaction");

        Random d = new Random();
        for (int i = 0; i < 10; i++)
        {
            var sleep = d.Next(100, 2000);


            Action<int> succes = (int x) =>
            {
                Thread.Sleep(x);
                Console.WriteLine("sleep={2}, Task={0}, Thread={1}: Begin successful transaction",
                   Task.CurrentId, Thread.CurrentThread.ManagedThreadId, x);
            };

            Task t1 = Task.Factory.StartNew(() => succes(sleep));
        }
        Console.ReadLine();
    }

Но я не понимаю, почему он выводит все строки на консоль, игнорируя Sleep (random)

Может кто-нибудь объяснить мне это?

Ответы [ 3 ]

6 голосов
/ 29 декабря 2011

Важно:

TaskScheduler по умолчанию TPL не гарантирует поток на задачу - один поток может использоваться для обработки нескольких задач.

Вызов Thread.Sleep может повлиять на производительность других задач..

Вы можете создать свою задачу с подсказкой TaskCreationOptions.LongRunning , таким образом TaskScheduler назначит выделенный поток для задачи, и будет безопасно блокировать ее.

2 голосов
/ 29 октября 2010

Ваш код использует значение i вместо сгенерированного случайного числа.Он не игнорирует сон, а скорее спит от 0 до 10 мс каждую итерацию.

Попробуйте:

Thread.Sleep(sleep);
0 голосов
/ 29 сентября 2011

Предложение

Task t1 = Task.Factory.StartNew (() => succes (sleep));

Создает задание и автоматически запускает его, затем снова выполняет итерацию внутри for, не дожидаясь завершения задания. Поэтому, когда вторая задача создана и выполнена, первая может быть завершена. Я имею в виду, что вы не ждете окончания задач:

Вы должны попробовать

Task t1 = Task.Factory.StartNew(() => succes(sleep)); 
t1.Wait();
...