System.Threading.Tasks не подчиняется правилам запуска? - PullRequest
1 голос
/ 30 сентября 2011

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

Вопрос: Почему задачи кажутсяначать с запуска?

Это пример кода с веб-сайта Microsoft о задачах.Он описывается как создание незапущенной задачи, создание второй запущенной задачи и ожидание ее завершения, затем запуск первой задачи и, наконец, синхронный запуск третьей задачи в главном потоке.

Вот незакомментированная версияпример кода:

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

class StartNewDemo
{
    static void Main()
    {
        Action<object> action = (object obj) =>
        {
            Console.WriteLine("Task={0}, obj={1}, Thread={2}", Task.CurrentId, obj.ToString(), Thread.CurrentThread.ManagedThreadId);
        };

        Task t1 = new Task(action, "alpha");

        Task t2 = Task.Factory.StartNew(action, "beta");

        t2.Wait();

        t1.Start();

        Console.WriteLine("t1 has been launched. (Main Thread={0})", Thread.CurrentThread.ManagedThreadId);

        t1.Wait();

        Task t3 = new Task(action, "gamma");

        t3.RunSynchronously();

        t3.Wait();
    }
}

Вот результаты:

Task=1, obj=beta, Thread=3
t1 has been launched. (Main Thread=1)
Task=2, obj=alpha, Thread=3
Task=3, obj=gamma, Thread=1

Из описания задача 1, которая является бета-версией, должна выполняться только после того, как задача 2 завершена, поэтому основной потокможет прогрессироватьЭто не похоже на случай из этого вывода.Я также выполнил второй тестовый прогон, в котором я поместил отображение количества тиков в объект действия и получил его, подтверждая, что Задача 1 действительно запускается до завершения Задачи 2.

Task=1, obj=beta, Thread=3 (634529151744201906)
t1 has been launched. (Main Thread=1)
Task=2, obj=alpha, Thread=3 (634529151744221908)
Task=3, obj=gamma, Thread=1 (634529151744221908)

Я не пытаюсь выполнитьЧто-нибудь необычное здесь, я просто ищу объяснение того, почему Task1 (obj = beta), по-видимому, выполняется перед тем, как ему дано указание сделать это.

Ответы [ 3 ]

2 голосов
/ 30 сентября 2011
Task=1, obj=beta, Thread=3

Task = 1 немного вводит в заблуждение, поскольку в примере кода это t2.Вы можете видеть это, потому что «бета» присутствует.Он запускается и завершается перед запуском t1.

t1 has been launched. (Main Thread=1)
Task=2, obj=alpha, Thread=3

Это t1 (с идентификатором 2).

Task=3, obj=gamma, Thread=1

Это t3.

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

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

Код выполняется следующим образом:

  • t1 (alpha) создан, но не выполнен
  • t2 (beta) создается, запускается, печатает на консоль (очевидно, с TaskId == 1) и ожидает при
  • t1 (alpha), запускается, очевидно, с TaskId == 2
  • выводится уведомление о запуске t1
  • t1 (alpha) выводит на консоль и ожидает
  • остальное должно быть очевидным
1 голос
/ 30 сентября 2011

Потоки или присвоение Task s потокам не гарантируется (то есть недетерминировано) в порядке без какой-либо формы синхронизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...