c# - 在类构造函数中使用 using 语句是否有意义?
问题描述
我的意思是使用下面的语句,在我使用FileSystemWatcher
实例的类的构造函数中,在类构造函数中使用这样的语句是否有意义,using
或者它必须在没有using
语句的构造函数中?
public partial class MyService : ServiceBase
{
FileInfo file;
StreamWriter writer;
FileSystemWatcher watcher1;
FileSystemWatcher watcher2;
FileSystemWatcher watcher3;
public MyService()
{
InitializeComponent();
file = new FileInfo(@"D:\LOGS\Log.txt");
writer = file.CreateText();
//I mean this using
using (watcher1 = new FileSystemWatcher(@"C:\"))
{
watcher1.Created += OnChanged;
watcher1.Deleted += OnChanged;
watcher1.Renamed += OnRenamed;
watcher1.Changed += OnChanged;
watcher1.EnableRaisingEvents = true;
}
//I mean this using
using (watcher3 = new FileSystemWatcher(@"C:\Users"))
{
watcher3.IncludeSubdirectories = true;
watcher3.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite |
NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher3.Created += OnChanged;
watcher3.Deleted += OnChanged;
watcher3.Renamed += OnRenamed;
watcher3.Changed += OnChanged;
watcher3.Filter = "*.*";
watcher3.EnableRaisingEvents = true;
}
//I mean this using
using (watcher2 = new FileSystemWatcher(@"D:\"))
{
watcher2.IncludeSubdirectories = true;
watcher2.Created += OnChanged;
watcher2.Deleted += OnChanged;
watcher2.Renamed += OnRenamed;
watcher2.Changed += OnChanged;
watcher2.EnableRaisingEvents = true;
}
}
解决方案
您应该在服务运行时保持所有这些 FileSysteWatcher 实例不被释放。但是您也应该在处置服务时处置所有资源。所以最好的解决方案是通过你的服务来实现并在方法IDisposable
中配置所有资源。Dispose
public partial class MyService : ServiceBase
{
FileSystemWatcher watcher1;
FileSystemWatcher watcher2;
FileSystemWatcher watcher3;
protected override void Dispose(bool disposing)
{
if (disposing)
{
watcher1?.Dispose();
watcher2?.Dispose();
watcher3?.Dispose();
}
base.Dispose(disposing);
}
}
还要考虑将初始化逻辑移至OnStart
服务方法。或者至少在服务启动时启用观察者并在服务停止时禁用它们:
protected override void OnStart(string[] args)
{
base.OnStart(args);
watcher1.EnableRaisingEvents = true;
watcher2.EnableRaisingEvents = true;
watcher3.EnableRaisingEvents = true;
}
protected override void OnStop()
{
base.OnStop();
watcher1.EnableRaisingEvents = false;
watcher2.EnableRaisingEvents = false;
watcher3.EnableRaisingEvents = false;
}
注意:不要忘记处理writer
。
推荐阅读
- java - 如何动态更改主题属性?
- firebase - Flutter Firebase:检索文档列表,仅限于数组中的ID?
- vim - 如何在 Vim 中第一次出现字符之前添加文本?
- c++ - Linux 上的 C++ 内存泄漏(或奇怪的行为),而不是 Windows
- pytorch - torchaudio C++ 扩展不可用
- python - Pandas - 如何定义具有相同数据类型的所有列的条件
- python - Django比较两个查询集并附加自定义对象
- php - laravel中与三个表的关系
- python - Python 和 Json - 从 API 中提取数据部分的最佳方法?
- python - 我写的代码应该给消息的(我是蓝色的)作者一个角色,它不起作用,请重写我的代码