Вопрос

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

 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, это работает, как и ожидалось. Игра с разными значениями сна дает мне более или менее результаты в зависимости от значения.

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

Это было полезно?

Решение

Я подозреваю, что ваша программа выходит, прежде чем задача получит возможность запустить.

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

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

var task = Task.Factory.StartNew( d );
task.Wait();

Другие советы

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

Task task = Task.Factory.StartNew(d);
task.Wait();

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

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();
    }
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top