Winforms Dispose由非UI线程上的Component.Finalize()调用-这是否意味着Dispose方法必须始终是线程安全的?

Winforms Dispose由非UI线程上的Component.Finalize()调用-这是否意味着Dispose方法必须始终是线程安全的?,winforms,Winforms,我检查了调用我的Dispose(bool)方法的线程。当应用程序运行时,总是由UI线程调用Dispose,比如单击[x]关闭表单时。但是当我关闭整个应用程序时,许多Dispose方法会在(单个)不同的线程上被调用。当我转储堆栈跟踪时,我看到它们都从 System.ComponentModel.Component.Finalize() 这是否意味着我所有的Dispose方法都需要线程安全?或者WinForms是否保证UI线程不再接触这些对象,并且它是否也在UI线程和正在终结的线程之间建立某种“以前

我检查了调用我的Dispose(bool)方法的线程。当应用程序运行时,总是由UI线程调用Dispose,比如单击[x]关闭表单时。但是当我关闭整个应用程序时,许多Dispose方法会在(单个)不同的线程上被调用。当我转储堆栈跟踪时,我看到它们都从 System.ComponentModel.Component.Finalize()


这是否意味着我所有的Dispose方法都需要线程安全?或者WinForms是否保证UI线程不再接触这些对象,并且它是否也在UI线程和正在终结的线程之间建立某种“以前发生过”的关系?

是的,终结器在单独的线程上工作。通常这是没有问题的,因为当一个对象完成时,任何用户线程(比如UI线程)都无法再访问它。因此,您通常不必在终结器中实现线程安全。

“通常”听起来有点模糊,但如果WinForms保证在终结器线程执行其工作时不再运行原始UI线程,那么我对此没有意见。通常,我只是指您的Dispose方法中可能存在同步问题,例如,当您尝试访问it中的共享资源时。。。但可以保证,当终结器运行时,所有其他线程都将挂起。