如何在执行程序时无限期地启动c#FileSystemWatcher函数?

我正在使用.Net Framework开发Windows程序。

我想创建一个使用FileSystemWatcher在特定文件夹中创建文件时执行功能的程序。

下面是我的代码。

public async Task<int> CollectFunc() {
   string path = @"C:\test";
   try
   {
      FileSystemWatcher watcher = new FileSystemWatcher
      {
      Path=path
      Filter="test.log"
      };
      watcher.Created += new FileSystemEventHandler(WatcherFunc);
      watcher.IncludeSubdrectories=true;
      watcher.EnableRaisingEvents=true;
   }
   catch
   {
      Console.WriteLine("Error");
   }
   

   while(true)
   {
      await Task.Delay(100000);
   }
}

public async void WatcherFunc(object source, FileSystemEventArgs e) {
   Console.WriteLine("File Created: " + e.FullPath);
}

启动程序时,将监视文件创建,直到关闭程序为止。

一个例子如下所示。

9月1日,将创建以下文件。C:\ test \ 20200901 \ test.log然后程序打印“创建的文件:C:\ test \ 20200901 \ test.log”。

并且在9月2日创建了C:\ test \ 20200902 \ test.log文件,程序将输出“文件已创建:C:\ test \ 20200902 \ test.log”。

...

但是有时Watcher无法正常工作,我必须重新启动程序。

请让我知道是否有比我的源代码更好或更稳定的逻辑。

期待您的回复。

菲尔多

尝试以下更改:

// Introduce a class field, to prevent the watcher reference from going out of scope.
private FileSystemWatcher watcher = null;

public void CollectFunc() { // no need for async any more ...
   string path = @"C:\test";
   try
   {
      // Init class field
      watcher = new FileSystemWatcher
      {
      Path=path
      Filter="test.log"
      };
      watcher.Created += new FileSystemEventHandler(WatcherFunc);
      watcher.IncludeSubdrectories=true;
      watcher.EnableRaisingEvents=true;
   }
   catch (Exception ex)
   {
      // Better know what the problem actually was.
      Console.WriteLine($"Error: {ex.Message}");
   }
   
   // It's a winforms app - we don't need to block this => away with while(true)
}

public async void WatcherFunc(object source, FileSystemEventArgs e) 
{
   // Just in case, catch and log exceptions
   try{
       Console.WriteLine("File Created: " + e.FullPath);
   } catch( Exception ex ) {
      // TODO: Log Exception or handle it.
   }
}

最重要的是:这是一个已知的问题,大量的更改和频繁的更改可能导致监视程序中的某些缓冲区溢出(如果仍然适用,但我记得几年前就遇到过)。

这里提到了缓冲区溢出问题https : //docs.microsoft.com/zh-cn/dotnet/api/system.io.filesystemwatcher.internalbuffersize?view=netcore-3.1#remarks

Error事件注册处理程序也可能是值得的https : //docs.microsoft.com/zh-cn/dotnet/api/system.io.filesystemwatcher.error?view=netcore-3.1

我猜您Console.WriteLine在事件处理程序中只是一个示例代码,实际上您要做的还不止这些。在过去,我发现如果我在这里保持代码很小并尽快处理事件,它将减轻FileSystemWatcher缓冲区的压力。

因此,我要做的是将文件路径排队入队列,并在另一个线程上处理该队列。这样可以确保事件尽快得到处理,而不会丢失任何事件。窥视会被队列变大而捕获,并由另一个线程独立处理。换句话说:事情堆积的观察者的缓冲区。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我的 SQL 查询无限期地执行?

无限期地反应上下文调用函数

如何在Spring Boot中无限期地创建请求

如何使特定的工作无限期地等待奴隶?

如何无限期地等待DOM加载?

iOS应用程序如何在后台无限期地保持TCP连接的活动?

应用程序的html加载,但是使用angular构建的js函数会无限期地卡住加载

如何在Java中无限期等待?

递归定义无限期地挂起

OrientDB无限期地锁定记录

如何无限期地每1分钟运行一个iOS应用程序?

如何创建在启动Django应用程序后无限期运行的单例芹菜任务?

以随机间隔无限期调用函数

Golang频道使程序无限期等待

在 R 中使用 foreach 启动时,完美的循环无限期地运行

Jenkins声明式管道无限期地等待执行者

下拉字段无限期地使用 API 调用调用函数

无限期地重复一个函数,最好不使用setInterval()

Express - nodejs 应用程序在浏览模块时无限期地旋转

应用程序不会无限期地监听数据库连接吗?

如何无限期清洁睡眠?

如何使数组无限期循环?

如何无限期地暂停Java中的线程并稍后恢复它?

如何保持JMS消息侦听器无限期地侦听

然后如何无限期地持有悲观锁,以便跟踪集群中的主节点?

如何使用Jquery无限期地刷新HTML中的标签

如何无限期地在Chrome中记录浏览历史记录?

如何无限期地循环功能(而不是使用常规的for循环)

如何使用Bash在各个白天无限期地运行命令?