【发布时间】:2011-09-30 00:08:37
【问题描述】:
重写:我已将问题精简为包含示例代码而不是指向它的链接以及结果和问题,因为周围的信息似乎引起了混乱。
问题:为什么任务似乎没有开始就开始了?
这是来自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,它是 Beta,应该只在任务 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) 在得到执行指令之前显然正在执行。
【问题讨论】:
-
“我正在开发的软件需要仔细控制在工作流程的特定阶段点亮多少或哪些内核”-您能解释一下原因吗?如果代码适合多线程,为什么需要特定的核心数?
-
从问题中删除了该行,因为它与问题无关。我想提供了太多的背景信息。
标签: c# .net multithreading task