You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中Thread.Join执行时机疑问:启动线程后执行其他代码再调用Join

关于线程执行与Join方法的疑问解答

第一个问题:线程独立执行、主线程同步运行的理解是否正确?

你的理解基本正确,但有个关键的坑需要注意:

当你调用myThread.Start()后,操作系统会调度这个新线程开始执行,它会和主线程逻辑上独立并行运行,主线程不会等待这个新线程完成,会继续同步执行后续的代码。

但这里的隐患是你用了async () => {}作为Thread的委托——Thread的构造函数接受的是ThreadStart(无返回值的void委托),而async void的委托在遇到第一个await时,当前线程(也就是myThread)会直接返回,剩下的异步代码会被调度到线程池的线程中执行。这意味着myVariable = //Some result....这段赋值代码,可能根本不是在你创建的myThread线程里完成的,后续用myThread.Join()可能无法正确等待赋值完成,因为myThread早就结束了。

如果你的线程逻辑里有异步操作,更推荐用Task来替代Thread,比如:

object myVariable;
var myTask = Task.Run(async () => {
    // Do something async....
    myVariable = // Some result....
});
// 主线程同步执行其他代码
await myTask; // 等待任务完成

第二个问题:Join方法的生效时机

你的疑问答案很明确:Join方法只会在你调用它的那一刻才开始生效等待。

具体流程是:

  1. 调用myThread.Start(),新线程开始执行
  2. 主线程执行那段耗时x秒的代码(这段时间里,myThread可能在并行运行,可能已经完成,也可能还在跑)
  3. 主线程执行到myThread.Join(),此时才会检查myThread是否已经结束:
    • 如果myThread已经完成,Join会立即返回,主线程继续往下走
    • 如果myThread还在运行,主线程会暂停,直到myThread结束后才继续执行

简单说,Join不会“提前生效”,它只在被调用的那个时间点开始等待,之前主线程该干嘛干嘛,完全不受影响。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:22:59