Переписать: я сократил вопрос, чтобы в нем содержался пример кода вместо ссылки на него, а результаты и вопрос, поскольку окружающая информация, казалось, вызывала путаницу.
Вопрос: Почему задачи кажутсяначать с запуска?
Это пример кода с веб-сайта 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), по-видимому, выполняется перед тем, как ему дано указание сделать это.