C#-处置应该做什么-只清理资源或执行一些“业务逻辑”?
作者:互联网
这个问题已经在这里有了答案: > Should “Dispose” only be used for types containing unmanaged resources? 15个
考虑到IDisposable的语义,除了清除资源之外,Dispose还应该做什么?
我看到许多类都使用Dispose方法来启动关闭过程和其他一些东西,而不仅仅是进行“资源清理”工作.例如,如果您在类中有一个线程需要关闭,则您是否希望调用Dispose正常关闭该线程?
恕我直言,我将在此对象上实现Stop / Shutdown方法,并在此适当地关闭线程,而在Dispose中,我将检查线程何时仍然存在以简单地在其上调用Abort(暗杀样式:)).
计时器和其他所有资源都可以使用同一示例,这些资源在完成使用该对象之前可以具有某种终止过程.
.NET中相互冲突的设计的两个示例:
> Windows服务的ServiceBase具有OnStop以及Dispose to
覆盖.
> WebApp.从OWIN开始进行自我托管可为您提供
IDisposable,我想该服务会在
处理过程.
解决方法:
与其以IDisposable合同的方式思考,不如将IDisposable视为通用对象合同的一部分,该协议规定对象除IDisposable之外无需其他任何形式的通知.实施IDisposable应该根本不需要任何通知).在可以安全地放弃对象之前,Dispose方法应该执行所有需要做的事情.
唯一有问题的方面是执行清理时可能会发生异常,并且Dispose无法知道在这种情况下应采取的措施.如果在正常(非异常)程序执行期间调用了Dispose,则在清理失败时应抛出异常.但是,如果在从异常平移堆栈时调用它,则它可能抛出的任何异常通常都会破坏所有有关较早异常的证据(因此,使其静默失败比抛出异常要好得多).不幸的是,Dispose无法通过哪种方式确定哪种情况适用,因此在清理失败的情况下,也无法始终如一地做正确的事情.
标签:idisposable,architecture,c,net,design-patterns 来源: https://codeday.me/bug/20191122/2057113.html