重写:我已将问题精简为包含示例代码而不是示例代码的链接以及结果和问题,因为周围的信息似乎会造成混淆。
问题:为什么任务似乎没有开始就开始了?
这是来自 Microsoft Website 的一段示例代码在任务上。它被描述为创建一个未启动的任务,创建第二个启动的任务并等待它完成,然后启动第一个任务,最后在主线程中同步启动第三个任务。
这是示例代码的未注释版本:
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 完成后运行,以便主线程可以继续进行。从这个输出来看,情况似乎并非如此。我还运行了第二次测试运行,我将滴答计数的显示放入操作对象并接收到它,确认 Task1 确实在 Task2 完成之前开始。
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) 在收到指令之前显然正在执行。
最佳答案
Task=1, obj=beta, Thread=3
Task=1 在这里有点误导,因为这实际上是示例代码中的 t2。您可以看到这一点,因为存在“beta”。它在运行 t1 之前启动并完成。
t1 has been launched. (Main Thread=1)
Task=2, obj=alpha, Thread=3
这是 t1(ID 为 2)。
Task=3, obj=gamma, Thread=1
这是 t3。
关于c# - System.Threading.Tasks 不遵守启动规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7604714/