将Dispose / Close方法编写为异步是不是一个坏主意?

时间:2011-06-01 12:27:19

标签: .net asynchronous dispose

而不是在同一个线程上进行清理(或启动后台线程并阻塞直到它完成)在“后台”上启动清理(IsBackground = false,因此它不会过早终止)线程并立即返回

这是一个坏主意,有多糟糕?这是一个好主意吗?

4 个答案:

答案 0 :(得分:5)

我认为您希望在处理非托管资源时比在启动后台线程时更加努力。如果它是一个使用频繁的过程,你会发现这会产生很大的开销,如果没有其他的话。

如果非托管资源的创建和销毁非常昂贵,那么您可能会考虑在应用程序的生命周期内维护一个公共实例或实例池。

答案 1 :(得分:4)

使用异步清理替换Dispose()中的IDisposable会违反Liskov Subsitution Principle,因为人们可能希望在通话后立即再次使用这些资源。

我认为这是需要进行的一些优化,因为频繁的分配/解除分配,这意味着最终你可能只是将问题转移到越来越多的待处理对象以便在后台线程中处理。这将导致内存短缺,并且需要一些同步以确保这些对象的数量不会增长到天空。

像拉撒路所说,更合适的解决方案可能是pool of reusable objects

答案 2 :(得分:1)

您不希望这样做的一个地方是,如果您的对象持有其他线程可能正在等待使用的某些有限资源。

我非常有兴趣看到其他答案,因为我认为这是一个有趣的想法,在某些情况下可能会更快地将数据更快地返回给用户。

答案 3 :(得分:0)

在完成其他代码可能依赖的所有预期效果之前,不应返回Dispose方法。 Dispose推迟清理任务是合理的,这样做不会破坏其他代码的期望。例如,连接池类的Dispose方法可能会立即将Disposed连接添加到池中而不关闭它们,并且有一个后台线程关闭一段时间未使用的连接。如果可以打开多少个不同的连接,并且由于池中充满了不适合当前请求的缓存(但目前未使用)的连接,则无法满足请求,“打开”方法必须能够加快清理游泳池。