首页 > 解决方案 > 在类构造函数中使用 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;
                }
            }

标签: c#constructordisposeusing-statement

解决方案


您应该在服务运行时保持所有这些 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


推荐阅读