当前位置: 首页 > 编程语言 > C#

FinalizersandProcessing分享

时间:2023-04-11 01:40:03 C#

FinalizersandProcessing我有一个名为BackgroundWorker的类,它有一个不断运行的线程。要关闭此线程,名为stopto的实例变量必须为真。为确保在使用完类后释放线程,我添加了IDisposable和一个调用Dispose()的终结器。假设stop=true确实导致该线程退出,这个sippet是否正确?可以从终结器调用Dispose,对吗?如果对象继承了IDisposable,终结器应该总是调用Dispose,对吗?//////强制后台线程退出。///publicvoidDispose(){lock(this.locker){this.stop=true;}}~BackgroundWorker(){this.Dispose();你的代码很好,虽然锁定终结器有点“可怕”,但我会避免它-如果你遇到死锁......我不是100%确定会发生什么,但它不会要好。但是,如果您安全的话,这应该不是问题。最多。垃圾收集的内部机制很痛苦,我希望你永远不会看到它们;)正如MarcGravell指出的那样,一个让你摆脱锁的volatilebool将缓解这个问题。如果可以,请实施此更改。nedruod的代码将赋值放在if(disposing)检查中,这是完全错误的——线程是非托管资源,即使没有明确处置也必须停止。您的代码很好,我只是指出您不应该采纳该代码段中给出的建议。是的,如果实现IDisposable模式,您几乎应该总是从终结器调用Dispose()。完整的IDisposable模式比你拥有的要大一些,但你并不总是需要它——它只提供了两种额外的可能性:,在最终对象之外);使子类能够覆盖Dispose()方法。首先,严重警告。不要像你一样使用终结器。如果你锁定了终结器,你就会为一些非常糟糕的效果做好准备。短篇小说不应该被完成。现在回到最初的问题。publicvoidDispose(){Dispose(真);GC.SuppressFinalize(这个);}//////强制后台线程退出。///protectedvirtualvoidDispose(booldisposing){if(disposing){lock(this.locker){this.stop=true;}}}~BackgroundWorker(){处置(false);拥有终结器的唯一原因是允许子类扩展和释放非托管资源。如果你没有子类,那么密封你的类并完全放弃终结器。出于兴趣,您有什么理由不能使用完全支持取消的常规BackgroundWorker?重新锁定-易变的bool字段可能不那么麻烦。然而,在这种情况下,您的终结器不会做任何有趣的事情,尤其是考虑到“if(disposing)”——即它只在Dispose()期间运行有趣的代码。就个人而言,我很想坚持使用IDisposable而不是提供终结器:您应该使用Dispose()清理它。“停止”实例变量是一个属性吗?如果不是,则在终结器中设置它没有特别的意义——没有任何东西可以引用该对象,因此没有任何东西可以查询该成员。如果您实际上正在释放资源,那么让Dispose()和终结器执行相同的工作是一个很好的模式(首先测试以查看是否仍需要完成工作)。您需要完整的一次性模式,但线程必须可以访问停止点。如果是被处理类的成员变量就不好了,因为它不能引用被处理类。考虑让一个事件由一个线程拥有并发出信号以进行处理。实现终结器的对象需要引用一个标志-存储在另一个对象中-线程将能够看到;线程不得对实现终结器的对象有任何直接或间接的强引用。终结器应该使用类似CompareExchange的东西来设置标志,线程应该使用类似的东西来测试它。请注意,如果一个对象的终结器访问另一个对象,则另一个对象可能已终结并仍然存在。一个终结器可以引用其他对象,如果它以一种不会被它的终结所束缚的方式这样做的话。如果您所做的只是设置一个标志,那很好。以上就是《C#学习教程:终结者与处理分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: