Задача Thread.Sleep 'breaks' - PullRequest
       15

Задача Thread.Sleep 'breaks'

1 голос
/ 30 ноября 2011

Итак, у меня есть следующий код

 Action d = () =>
                {                                                             
                   for (int i = 0; i <= 10; i++)
                   {
                      Thread.Sleep(50);
                      Console.WriteLine("Task: {0} log:{1}",Thread.CurrentThread.ManagedThreadId,i);
                   }
                };
 Task.Factory.StartNew(d);

Однако ничего не выводится. Но если я прокомментирую Thread.Sleep, он будет работать как положено. Игра с различными значениями Sleep дает мне более или менее результат в зависимости от значения.

Почему так происходит?

Ответы [ 3 ]

3 голосов
/ 30 ноября 2011

Вы ждете, пока задача завершится где-нибудь, или ваша программа завершает работу, прежде чем задача будет выполнена?

Task task = Task.Factory.StartNew(d);
task.Wait();
3 голосов
/ 30 ноября 2011

Я подозреваю, что ваша программа завершает работу до того, как задача сможет ее запустить.

По умолчанию задачи выполняются в потоках пула потоков, которые являются фоновыми потоками.Это означает, что ваша программа не ждет, пока они завершат работу, прежде чем выйти.

Попробуйте добавить это в свой основной поток:

var task = Task.Factory.StartNew( d );
task.Wait();
0 голосов

Я только что запустил ваш код, и он выдает:

Task: 10 log:0
Task: 10 log:1
Task: 10 log:2
Task: 10 log:3
Task: 10 log:4
Task: 10 log:5
Task: 10 log:6
Task: 10 log:7
Task: 10 log:8
Task: 10 log:9
Task: 10 log:10

Вот код консоли на основе вашего приложения, которое я запустил:

using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      Action d = () =>
      {
        for (int i = 0; i <= 10; i++)
        {
          Thread.Sleep(50);
          Console.WriteLine("Task: {0} log:{1}", Thread.CurrentThread.ManagedThreadId, i);
        }
      };
      Task.Factory.StartNew(d);
      Console.ReadLine();
    }
  }
}
...