代码之家  ›  专栏  ›  技术社区  ›  Paul S Chapman

DispatchTimer未在服务中启动

  •  0
  • Paul S Chapman  · 技术社区  · 6 年前

    我有一个用c_实现的windows服务。该服务监视要保存的文件的多个目录。不过,为了使它更健壮,我正试图让它在一段时间后检查文件夹。

    名为watcher的内部类初始化filesystemwatcher和dispatchtimer。

    public class Watcher
    {
        FileSystemWatcher fileSystemWatcher = null;
    
        public delegate void TimerInvokedHandler(object sender);
        public event TimerInvokedHandler TimerInvoked;
    
        public DispatcherTimer Timer { get; set; }
    
        public int TimerMinutes { get; set; }
    
        public Watcher()
        {
    
        }
    
        public Watcher(String directory, String filter, String dap)
        {
            this.DAP            = dap;
            this.Directory      = directory;
            this.Filter         = filter;
        }
    
        public Boolean EnableRaisingTimerEvents
        {
            get { return this.Timer.IsEnabled;  }
            set
            {
                this.Timer.IsEnabled = value;
                if (value)
                {
                    this.Timer.Start();
                    Log("Timer Started");
                }
                else
                {
                    this.Timer.Stop();
                    Log("Timer Stopped");
                }
    
            }
        }
    
        private void Timer_Tick(object sender, EventArgs e)
        {
            StopWatch();
            TimerInvoked?.Invoke(sender);
        }
    
        public void StartWatch()
        {
            if (fileSystemWatcher == null)
            {
                fileSystemWatcher = new FileSystemWatcher();
                fileSystemWatcher.Filter = Filter;
                fileSystemWatcher.Path = Directory;
    
                fileSystemWatcher.Created += FileSystemWatcher_Created;
                fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;
    
                fileSystemWatcher.Error += FileSystemWatcher_Error;
            } 
    
            if (this.Timer == null)
            {
                Log("Initialising Timer");
    
                this.Timer = new DispatcherTimer();
                this.Timer.Interval = new TimeSpan(0, this.TimerMinutes, 0);
                this.Timer.Tick += Timer_Tick;
            }
    
            this.EnableRaisingFileSystemsEvents = true;
            this.EnableRaisingTimerEvents = true;
    
            Log(String.Format("Watching Directory {0}", Directory));
        }
    
        // stops timer and file system events
        public void StopWatch()
        {
            if (fileSystemWatcher != null) 
                EnableRaisingFileSystemsEvents = false;
    
            if (Timer != null)
            {
                EnableRaisingTimerEvents = false;
            }
    
            Log(String.Format("Watching {0} Switched Off", this.Directory));
        }
    
    
        private void Log ( String Message )
        {
            LogEvent?.Invoke(this, Message);
        }
    
    }
    

    外部类创建这些监视程序的列表,这是基于servicebase的,因为它是一个服务,因此只有在windows服务管理器中得到停止时才会结束

                    foreach (nhs_acquisition_profile pfl in p)
                    {
                        Watcher w = null;
                        String filePattern = String.Empty;
    
                        try
                        {
    
                            profileWatcherLog.WriteEntry(String.Format("Attempting to set-up watcher on {0} for DAP {1}",pfl.dap_file_location,pfl.dap_name));
    
                            if (pfl.dap_acquisition_method_loca.ToLower() == "xml") w = new Watcher(pfl.dap_file_location, "*.xml", pfl.dap_name);
                            else w = new Watcher(pfl.dap_file_location, "*.*", pfl.dap_name);
    
                            profileWatcherLog.WriteEntry("Initialising Event Handlers");
                            // initialise event handlers
                            w.FileCreated   += W_FileCreated;
                            w.FileRenamed   += W_FileRenamed;
                            w.TimerInvoked  += W_TimerInvoked;
                            w.LogEvent      += W_LogEvent;
                            profileWatcherLog.WriteEntry("Event Handlers initialised");
    
                            // dispatch timer
    
                            w.TimerMinutes = Convert.ToInt32(Properties.Settings.Default.TimerDelay);
    
                            w.StartWatch();
    
                            profileWatcherLog.WriteEntry("Watch started....Adding to Watcher List");
    
                            // add the watcher to the list of watchers
                            FileWatcherList.Add(w);
    
                            profileWatcherLog.WriteEntry("Added to list of file watchers");
    
                            profileWatcherLog.WriteEntry(String.Format("Watching {0} for files matching *.* for DAP {1}",pfl.dap_file_location,pfl.dap_name));
                        }
                        catch
                        {
                            throw;
                        }
                    }
    

    变量filewatcherlist是profilewatcher类的一个字段,它构成整个服务。

    我发现DispatchTimer滴答事件从未发生过。我可以合理地确定,这不是dispatchtimer在滴答声之前被释放的实例,但看不出它为什么没有被触发。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Paul S Chapman    6 年前

    Dmitri是对的,我应该用定时器而不是DispatchTimer。一旦我开始这样做,效果就很好了。