Thread.join 超时,即使委托显示为已完成

Thread.join times out even though delegate appears completed

提问人:ericc 提问时间:10/5/2023 最后编辑:Theodor Zouliasericc 更新时间:10/5/2023 访问量:49

问:

我正在调试其他人的 .NET Framework 4.8 C# 代码中的问题,该代码尝试使用 Activator.CreateTypeInstance 实例化第三方程序集中的类型,该程序集是从传递到后台 STA 线程的委托内部调用的。线程启动后,调用线程将在 Thread.join 上阻塞最多 60 秒。不要问我为什么在这里使用后台线程(代码已有 10 多年的历史),因为 Thread.Join 会消除任何并发优势。

在任何情况下,类型都会实例化并委托完成,但 Thread.Join 仍会等待 60 秒超时。在Visual Studio线程窗格中,当我在委托完成后但在超时结束之前使用调试器的“全部中断”时,我可以看到线程在线程窗格中被销毁,但Thread.Join仍在等待,所以我想知道是什么原因导致了这种行为?它是否与对 Activator.CreateInstance 的调用相关联,使一些剩余状态/句柄处于打开状态?

C# .NET 多线程处理

评论

1赞 Enigmativity 10/5/2023
我觉得你不可能提供一个最小的可重复的例子。如果你尝试,你会解决你自己的问题。换句话说,您需要尝试制作一个最小的可重现示例
0赞 shingo 10/5/2023
“我可以看到线程被破坏了”你指的是哪个线程?destroyed 是什么意思?由于线程没有这样的状态,并且调用线程仍在保留引用。
1赞 Charlieface 10/6/2023
让我猜测 STA 导致对 UI 线程的死锁。如果您使用的是 STA,请不要阻止

答:

0赞 B.Griffin 10/5/2023 #1

Thread.Join在线程停止执行或分配的时间间隔过去之前不会返回。(参见:https://learn.microsoft.com/en-us/dotnet/standard/threading/destroying-threads)

我的猜测是,即使委托正在完成,它也没有完成线程,因此会一直等待,直到它超时。Thread.Join