确保在 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` 接口来管理这些资源