c# - System.Threading.Tasks 不遵守启动规则?

标签 c# .net multithreading task

重写:我已将问题精简为包含示例代码而不是示例代码的链接以及结果和问题,因为周围的信息似乎会造成混淆。

问题:为什么任务似乎没有开始就开始了?

这是来自 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/

相关文章:

c# - 等待将文件添加到目录的阻塞方法

c# - 延迟某个 Action 一段时间

c# - WebBrowser.DrawToBitmap 留下白色像素

c# - 如何使用 C# 使用 MsTest 对属性进行单元测试?

c# - 在 C# 中更改 WebBrowser 控件的显示字体?

c# - .NET/ASP.NET 与 Java 的高级功能比较

.net - 维护多个项目使用的类库程序集

C#多线程代码审查

c# - .net 应用程序 CPU 使用率高

c# - AutoMapper map 子属性也定义了 map