C# 线程从未启动过渡到运行的时间

C# 线程从未启动过渡到运行的时间,c#,multithreading,C#,Multithreading,“未启动的线程通过调用Start转换为运行状态。”[from] 线程何时从未启动状态过渡到运行状态 如果我实例化一个线程并调用Start,那么在该线程实际运行之前是否有延迟?如果实例化线程在启动后立即调用Join,是否有可能捕获处于未启动状态的新线程?对Start的调用不是异步的,因此该方法将在线程启动时返回。I'v我们在一些示例应用程序中完成了这一操作,之后立即调用Join不会导致任何问题。ThreadState的文档。未启动的状态 Unstarted The Thread::Start

“未启动的线程通过调用Start转换为运行状态。”[from]

线程何时从未启动状态过渡到运行状态


如果我实例化一个线程并调用Start,那么在该线程实际运行之前是否有延迟?如果实例化线程在启动后立即调用Join,是否有可能捕获处于未启动状态的新线程?

Start
的调用不是异步的,因此该方法将在线程启动时返回。I'v我们在一些示例应用程序中完成了这一操作,之后立即调用
Join
不会导致任何问题。

ThreadState的文档。未启动的状态

Unstarted   The Thread::Start method has not been invoked on the thread.
换句话说,不,您不能以Thread.Unstarted结束。在调用Thread::Start之后,该线程不能保证处于ThreadState。但在运行时,如果它在检查状态之前阻塞互斥体,则它可能处于ThreadState.WaitSleepJoin等状态

导致联接出现问题的唯一ThreadState是ThreadState。但尚未启动,因此在启动后立即调用联接是安全的,前提是启动不会引发异常

  • Start()
    方法返回之前,它的状态变为
    Running
    ,尽管它可能还没有(通常也不会)完成任何实际工作,因为它可能还没有得到任何核心时间。大多数时候,我们可以认为tread正在运行的事实已经足够(就像我们可以想到的大多数时间一样)“我们有6个线程在运行”,如果我们只有4个内核,那么显然我们实际上只有4个线程在运行)。这也可能是,当你到达调用线程的下一条指令时,它是
    WaitSleepJoin
    或者甚至
    Stopped
    ,但它不会是
    未启动的

  • 调用
    Join()
    是非常安全的,即使在
    Start()
    之后的下一个语句中也是如此(尽管这很少有用)


  • 我相信你问题的第一行为你解答了这个问题。它说它是通过调用Start进行转换的,它没有说它发生在Start返回之前。。。