C# WinForm关闭时释放 资源

确保在 C# Windows Forms 应用程序中,当 `Form` 关闭时正确释放资源是至关重要的。这包括停止任何后台任务、取消定时器、关闭数据库连接或其他外部资源,并确保所有托管和非托管资源都被适当清理。

实现步骤

1. 使用 `FormClosing` 和 `FormClosed` 事件

- **`FormClosing`**:用于执行取消操作或进行最后的清理工作,如保存用户设置、确认退出等。
- **`FormClosed`**:用于执行最终的清理工作,如释放资源。

2. 使用 `IDisposable` 接口

如果您的窗体或控件实现了 `IDisposable` 接口,应该在适当的时机调用 `Dispose()` 方法来释放资源。

3. 确保所有资源都得到释放

对于每个可能占用资源的对象(如定时器、文件流、数据库连接等),确保它们在窗体关闭时被正确释放。

 示例代码

以下是一个完整的示例,展示了如何在 `Form` 关闭时释放资源:
using System;
using System.Windows.Forms;
using System.Timers;

public partial class MainForm : Form, IDisposable
{
    private System.Timers.Timer timer;
    private volatile bool isClosing = false;
    private CancellationTokenSource cancellationTokenSource;

    public MainForm()
    {
        InitializeComponent();
        InitializeResources();
    }

    private void InitializeResources()
    {
        // 初始化定时器
        timer = new System.Timers.Timer(1000); // 设置间隔时间,单位为毫秒
        timer.Elapsed += Timer_Elapsed;
        timer.AutoReset = true;
        timer.Start();

        // 初始化其他资源
        // ...
    }

    private void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (isClosing || textBox100.IsDisposed || txtOMRTorque.IsDisposed)
        {
            return;
        }

        this.Invoke((MethodInvoker)delegate
        {
            if (!textBox100.IsDisposed && !txtOMRTorque.IsDisposed)
            {
                textBox100.Text = utorque.ToString();
                txtOMRTorque.Text = utorqueOMR.ToString();
            }
        });
    }

    // 窗体关闭时处理资源释放
    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        isClosing = true;

        // 取消后台任务
        cancellationTokenSource?.Cancel();

        // 停止并释放定时器资源
        timer.Stop();
        timer.Dispose();

        // 清理其他资源
        CleanupResources();

        // 如果有其他需要等待的任务,可以在这里等待
        // await Task.Delay(500); // 给予一定时间让后台任务响应取消

        // 如果您实现了 Dispose 方法,可以在这里调用它
        this.Dispose(true);
    }

    // 最终清理工作
    private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        // 这里可以做最终的清理工作
    }

    // 清理其他资源的方法
    private void CleanupResources()
    {
        // 例如,关闭数据库连接或文件流
        // ...
    }

    // 显式实现 IDisposable 接口
    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (components != null)
            {
                components.Dispose();
            }

            // 释放其他托管资源
            // ...
        }

        // 释放非托管资源
        // ...

        base.Dispose(disposing);
    }
}
```

代码解释

1. 初始化资源:
   - 在构造函数中调用 `InitializeResources` 方法来初始化定时器和其他资源。

2. 定时器回调:
   - 在 `Timer_Elapsed` 方法中检查 `isClosing` 标志和控件状态,以避免访问已被处置的控件。

3. 窗体关闭事件:
   - `MainForm_FormClosing` 方法中:
     - 设置 `isClosing` 标志为 `true`。
     - 取消后台任务(如果有)。
     - 停止并释放定时器资源。
     - 调用 `CleanupResources` 方法清理其他资源。
     - 调用 `Dispose(true)` 来显式释放资源。
   
4. 最终清理工作:
   - `MainForm_FormClosed` 方法中可以进行最终的清理工作。

5. `IDisposable` 接口:
   - 实现 `Dispose(bool disposing)` 方法来分别处理托管和非托管资源的释放。

总结

通过上述方法,可以确保在 `Form` 关闭时正确释放所有资源,从而避免资源泄漏和其他潜在问题。确保所有资源(如定时器、文件流、数据库连接等)都在窗体关闭时被正确释放,并且使用 `IDisposable` 接口来管理这些资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值