首页 新闻 会员 周边 捐助

Winform 窗体实例对象无法释放

0
悬赏园豆:50 [待解决问题]

德芙yo的主页 德芙yo | 初学一级 | 园豆:156
提问于:2022-12-29 17:16
< >
分享
所有回答(6)
0

调用Dispose()方法来释放窗体

lf03 | 园豆:549 (小虾三级) | 2022-12-29 17:46

要是这么容易还用发帖😅

支持(1) 反对(0) 德芙yo | 园豆:156 (初学一级) | 2022-12-29 17:59
0

对象无法释放,看下窗体内的东西与没有被其他地方引用,先把所有联系断干净了

猝不及防 | 园豆:2882 (老鸟四级) | 2022-12-30 11:06

这图就是,被子组件的事件持有引用无法释放

支持(0) 反对(0) 德芙yo | 园豆:156 (初学一级) | 2022-12-30 11:24

@德芙yo: 看一下这个子组件内部有没有disopose方法

支持(0) 反对(0) 猝不及防 | 园豆:2882 (老鸟四级) | 2022-12-30 11:28

@猝不及防: 控件肯定有dispose

支持(0) 反对(0) 德芙yo | 园豆:156 (初学一级) | 2022-12-30 11:32

@德芙yo: 调用dispose还是释放不了?

支持(0) 反对(0) 猝不及防 | 园豆:2882 (老鸟四级) | 2022-12-30 11:35

@猝不及防: 对

支持(0) 反对(0) 德芙yo | 园豆:156 (初学一级) | 2022-12-30 11:36

@德芙yo: 你可以做个实验,找个空窗口加上组件,看能不能关闭,能关闭的话还是从自己逻辑找原因

支持(0) 反对(0) 猝不及防 | 园豆:2882 (老鸟四级) | 2022-12-30 11:36

@猝不及防: 其他的肯定可以,就是这一处找不到问题,别人写的代码真的服了

支持(0) 反对(0) 德芙yo | 园豆:156 (初学一级) | 2022-12-30 11:38

@德芙yo: 所以你得看一下逻辑,内部缓存了什么引用

支持(0) 反对(0) 猝不及防 | 园豆:2882 (老鸟四级) | 2022-12-30 11:45
0

操作哪步的时候出现这个问题,我还真没遇到过你这个问题,仔细检查下代码,看你命名应该是写的与医疗行业有关的项目,建议还是仔细检查下代码,光看你的截图也不好判断

狼图腾TOP | 园豆:322 (菜鸟二级) | 2022-12-30 11:20

这图上显示窗体被窗体内的子组件的事件持有,但是窗体都关闭,为什么会被子组件持有引用无法释放,还是说这个强句柄的问题

支持(0) 反对(0) 德芙yo | 园豆:156 (初学一级) | 2022-12-30 11:23

@德芙yo: 应该是你代码写的问题,委托没写好,子父窗体传递出了问题,我之前只是遇到过,在偶发情况下打开子窗体关闭后,整个程序意外退出,最后还是给我解决了,没再发现这个现象

支持(0) 反对(0) 狼图腾TOP | 园豆:322 (菜鸟二级) | 2022-12-30 11:37
0

写个可复现问题的demo出来吧,这样方便解决问题

会长 | 园豆:12463 (专家六级) | 2022-12-30 13:51
0

winform是吧?你把子组件添加到父级窗口中,这样父级窗口要关闭的时候,会自动释放子组件资源
我看你这组件大概率是手动添加进去的,不是通过界面编辑器拖拽实现的

echo_lovely | 园豆:1566 (小虾三级) | 2023-01-06 08:55
0

在 Winform 窗体中,如果实例对象无法释放,可能是因为您没有正确地处理事件订阅和资源释放。以下是一些可能导致实例对象无法释放的常见问题和相应的解决方案:

  1. 事件订阅未正确处理
    在订阅事件时,如果不正确地处理事件订阅,可能会导致实例对象无法释放。例如,在订阅窗体关闭事件时,如果没有正确地取消订阅该事件,可能会导致实例对象无法释放。
public class MyForm : Form
{
    public MyForm()
    {
        this.FormClosing += MyForm_FormClosing;
    }
    private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        // 未取消订阅 FormClosing 事件,可能导致实例对象无法释放
        // this.FormClosing -= MyForm_FormClosing;
    }
}

解决方案:在订阅事件时,一定要确保正确地取消订阅该事件,以便在窗体关闭后释放资源。
2. 未正确释放资源
在使用 Winform 窗体时,如果没有正确地释放资源,可能会导致实例对象无法释放。例如,如果您在窗体中创建了一些非托管资源(如 GDI+ 对象),但在窗体关闭时未正确地释放这些资源,可能会导致实例对象无法释放。

public class MyForm : Form
{
    private Image image;
    public MyForm()
    {
        this.image = new Bitmap("image.png");
    }
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        // 未释放非托管资源 image,可能导致实例对象无法释放
        // this.image.Dispose();
        base.Dispose(disposing);
    }
}

解决方案:在窗体关闭时,一定要正确地释放所有资源,包括非托管资源。可以在 Dispose 方法中释放非托管资源。
3. 被其他对象引用
在某些情况下,实例对象无法释放的原因可能是因为它被其他对象引用了。例如,在一个长时间运行的任务中,您可能会创建一个窗体,并在任务中引用该窗体,但是当任务完成后,您忘记释放对该窗体的引用,从而导致实例对象无法释放。

public class MyTask
{
    private MyForm form;
    public async Task RunAsync()
    {
        this.form = new MyForm();
        // 在任务中引用窗体,可能导致实例对象无法释放
        // this.form.ShowDialog();
        await Task.Delay(5000);
    }
}

解决方案:在创建对象后,一定要确保及时释放对该对象的引用,以便在不再需要该对象时能够正确地释放它。例如,在上面的示例中,可以使用以下方法来释放对窗体的引用:

public async Task RunAsync()
{
    using (var form = new MyForm())
    {
        form.ShowDialog();
        await Task.Delay(5000);
    }
}

使用 using 语句创建窗体并在使用完毕后自动释放它。

LuoCore | 园豆:122 (初学一级) | 2023-03-31 09:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册