是否有一种方法可以在dispose方法中取消Dispose,换句话说,在调用A.Dispose()时不释放A。
Update我没有很好地解释,‘因为我想不出一个好的方法。我所拥有的是一个类,它在一个在单独线程中运行的弹出窗口中显示一个进度条(marquee)。当创建进度弹出时,返回一个类似于控制器的一次性对象,所以我们可以这样做:
using (var progress = Dialogs.ShowProgress("Please wait..."))
{
// do lots of stuff here
progress.UpdateStatus("Please wait some more...");
// do more stuff
}当使用块退出时,进度窗口将关闭并销毁。
现在,在这个块中发生的事情也会创建一个进度窗口,而不是返回一个新对象和创建一个新窗口,我希望返回由第一个实例创建的对象,并且只在第一个实例处理完之后才销毁它。
更新 Ok,我所做的是用每个Dialogs.ShowProgress()调用创建一个新的IDisposable对象,并将原始的控制器对象附加到它上。只要完成这些对象,这些对象就会被释放,而控制器只有在它是唯一要处理的对象时才会被释放。
发布于 2013-03-20 19:33:28
正如其他人所说,以一种可能不会真正处理的方式实现IDisposable是个坏主意。下面是实现您所要做的事情的另一种方法:
interface IMaybeDisposable
{
bool TryDispose(); //return false if dispose was canceled
}你可以像这样使用它:
IMaybeDisposable maybe = //something
try
{
// do something with maybe
}
finally
{
if (maybe.TryDispose())
// yay, it disposed!
else
// hm, it didn't dispose; do something else
}发布于 2013-03-20 19:23:14
好的。只是不要做任何你会做的事情来处理这个对象。你不需要积极做任何特别的事情。
不过,要小心;当有人处理某个对象时,他们希望它能够真正地处理它的非托管资源,而不是忽略您并持有它们。
发布于 2013-03-20 19:25:06
我会小心做这件事。如果您取消在using块的末尾处理一个方法,那么您就失去了对该对象的引用,并且您再也没有机会让它处理它的内容了,这意味着如果您不小心的话,您可能会泄漏资源。特别是,只有在dispose方法释放对大对象的引用时,我自己才会这样做,因为无论出于什么原因,我都不想立即收集垃圾。我不会跳过释放文件、数据库连接、网络套接字或任何其他无法垃圾收集的句柄。
正如评论者所指出的那样,我会尝试重构我的代码,这样无论我试图通过取消处置来解决任何问题,都会以其他一些不那么危险的方式解决。
如果您完全确定您有需要跳过处理某些东西的边缘条件,那么有一种方法可以这样做:
public void Dispose()
{
if(condition)
{
// do disposing stuff
}
}https://stackoverflow.com/questions/15532808
复制相似问题