首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消处理内部处理方法

取消处理内部处理方法
EN

Stack Overflow用户
提问于 2013-03-20 19:21:00
回答 5查看 1.5K关注 0票数 1

是否有一种方法可以在dispose方法中取消Dispose,换句话说,在调用A.Dispose()时不释放A。

Update我没有很好地解释,‘因为我想不出一个好的方法。我所拥有的是一个类,它在一个在单独线程中运行的弹出窗口中显示一个进度条(marquee)。当创建进度弹出时,返回一个类似于控制器的一次性对象,所以我们可以这样做:

代码语言:javascript
复制
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对象,并将原始的控制器对象附加到它上。只要完成这些对象,这些对象就会被释放,而控制器只有在它是唯一要处理的对象时才会被释放。

EN

回答 5

Stack Overflow用户

发布于 2013-03-20 19:33:28

正如其他人所说,以一种可能不会真正处理的方式实现IDisposable是个坏主意。下面是实现您所要做的事情的另一种方法:

代码语言:javascript
复制
interface IMaybeDisposable
{
    bool TryDispose(); //return false if dispose was canceled
}

你可以像这样使用它:

代码语言:javascript
复制
IMaybeDisposable maybe = //something
try
{
    // do something with maybe
}
finally
{
    if (maybe.TryDispose())
        // yay, it disposed!
    else
        // hm, it didn't dispose; do something else
}
票数 4
EN

Stack Overflow用户

发布于 2013-03-20 19:23:14

好的。只是不要做任何你会做的事情来处理这个对象。你不需要积极做任何特别的事情。

不过,要小心;当有人处理某个对象时,他们希望它能够真正地处理它的非托管资源,而不是忽略您并持有它们。

票数 1
EN

Stack Overflow用户

发布于 2013-03-20 19:25:06

我会小心做这件事。如果您取消在using块的末尾处理一个方法,那么您就失去了对该对象的引用,并且您再也没有机会让它处理它的内容了,这意味着如果您不小心的话,您可能会泄漏资源。特别是,只有在dispose方法释放对大对象的引用时,我自己才会这样做,因为无论出于什么原因,我都不想立即收集垃圾。我不会跳过释放文件、数据库连接、网络套接字或任何其他无法垃圾收集的句柄。

正如评论者所指出的那样,我会尝试重构我的代码,这样无论我试图通过取消处置来解决任何问题,都会以其他一些不那么危险的方式解决。

如果您完全确定您有需要跳过处理某些东西的边缘条件,那么有一种方法可以这样做:

代码语言:javascript
复制
public void Dispose()
{
     if(condition)
     {
         // do disposing stuff
     }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15532808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档