为啥 C# Thread.Join 在第一次等待时返回 [重复]

Posted

技术标签:

【中文标题】为啥 C# Thread.Join 在第一次等待时返回 [重复]【英文标题】:Why does C# Thread.Join returns on first await [duplicate]为什么 C# Thread.Join 在第一次等待时返回 [重复] 【发布时间】:2020-11-02 04:50:44 【问题描述】:

我有这样的代码:

var t = new Thread(async () =>
    
        await DoSomeWorkAsync();
    );
t.Start();
t.Join();


..

public static async Task DoSomeWorkAsync()

    var o = await GetSomethingAsync();
    o.StartSomething();
    ..

我注意到 t.Join() 在等待之后会自动返回。我想知道为什么。

谢谢

【问题讨论】:

async方法的基本特征是这样的方法在到达第一个不能同步完成的await语句时返回 .由于线程在其入口点方法返回时退出,因此结束线程。对async/await 所做的任何调查都会揭示这一点。请参阅重复的讨论直接和更一般地解决这个问题。 相关:Is it ok to use “async” with a ThreadStart method? 【参考方案1】:
I'd like to understand why

因为您使用的构造函数具有 delegatevoid 返回类型,您将看到与其他具有相同性质的委托相同的行为,例如操作。

public delegate void ThreadStart();

编译器会就此发出警告。然而,简而言之,无论您启动的线程是什么,您都在完全未观察到的情况下运行 async lambda 任务。

FWIW,您应该完全远离 Thread 类并使用 Tasks(除非您有一个特别需要它的特殊用例)。

【讨论】:

谢谢!这就说得通了。我认为添加一个异步 lambda 将使线程等待。我尝试在等待之后添加一行,并且该代码永远不会被执行: var t = new Thread(async () => await DoSomeWorkAsync(); DoSomethingSync(); );我希望 DoSomethingSync 至少会被执行。 @0x8000FFFF 是的,这里发生了几件事,都是坏事。总之,不要那样做 :) @0x8000FFFF 另外它没有运行后续方法的原因是因为您的应用程序可能在它安排继续执行 antecedent 任务之前结束

以上是关于为啥 C# Thread.Join 在第一次等待时返回 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java Thread.join()详解--父线程等待子线程结束后再结束

Thread线程join方法自我理解

多线程--Thread.join方法

C#多线程Thread.Join()的详解

浅析Java的Thread.join函数

boost - thread.join() 停止用户界面