关于c#:FileSystemWatcher Dispose调用挂起

关于c#:FileSystemWatcher Dispose调用挂起

FileSystemWatcher Dispose call hangs

我们刚刚开始遇到FileSystemWatcher的一个奇怪问题,其中对Dispose()的调用似乎挂起了。这段代码已经运行了一段时间,没有任何问题,但是我们刚刚升级到.NET3.5 SP1,因此我试图找出是否有人看到了此行为。以下是创建FileSystemWatcher的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (this.fileWatcher == null)
{
   this.fileWatcher = new FileSystemWatcher();
}
this.fileWatcher.BeginInit();
this.fileWatcher.IncludeSubdirectories = true;
this.fileWatcher.Path = project.Directory;
this.fileWatcher.EnableRaisingEvents = true;
this.fileWatcher.NotifyFilter = NotifyFilters.Attributes;
this.fileWatcher.Changed += delegate(object s, FileSystemEventArgs args)
{
   FileWatcherFileChanged(args);
};
this.fileWatcher.EndInit();

此方法的使用方式是更新TreeNode对象的状态图像(略微调整以删除特定于业务的信息):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void FileWatcherFileChanged(FileSystemEventArgs args)
{
   if (this.TreeView != null)
   {
      if (this.TreeView.InvokeRequired)
      {
         FileWatcherFileChangedCallback d = new FileWatcherFileChangedCallback(FileWatcherFileChanged);
         this.TreeView.Invoke(d, new object[]
      {
         args
      });
      }
      else
      {
         switch (args.ChangeType)
         {
            case WatcherChangeTypes.Changed:
               if (String.CompareOrdinal(this.project.FullName, args.FullPath) == 0)
               {
                  this.StateImageKey = GetStateImageKey();
               }
               else
               {
                  projectItemTreeNode.StateImageKey = GetStateImageKey();
               }
               break;
         }
      }
   }
}

是我们缺少的东西,还是.NET3.5 SP1的异常?


只是一个想法...这里是否有死锁问题?

您正在调用TreeView.Invoke,这是一个阻止调用。如果在单击任何按钮导致FileSystemWatcher.Dispose()调用时发生文件系统更改,则FileWatcherFileChanged方法将在后台线程上调用并调用TreeView.Invoke,它将阻塞直到表单线程可以处理Invoke请求为止。但是,您的表单线程将调用FileSystemWatcher.Dispose(),在处理所有未决的更改请求之前,它可能不会返回。

尝试将.Invoke更改为.BeginInvoke,看看是否有帮助。这可能会帮助您指出正确的方向。

当然,这也可能是.NET 3.5SP1问题。我只是根据您提供的代码在这里推测。


Scott,我们偶尔会看到control.invoke在.NET 2中出现问题。尝试切换到control.BeginInvoke,看看是否有帮助。

这样做将允许FileSystemWatcher线程立即返回。我怀疑您的问题在某种程度上是control.invoke被阻止,从而导致FileSystemWatcher在处置时冻结。


我们也遇到了这个问题。我们的应用程序在.Net 2.0上运行,但由VS 2008 SP1编译。我也安装了.NET 3.5 SP1。我也不知道为什么会发生这种情况,因为我们目前还没有其他线程在运行(这是在应用程序关闭期间),所以这看起来不像是一个死锁问题。


推荐阅读

    脚本linux上运行命令?

    脚本linux上运行命令?,工具,代码,时间,密码,系统,环境,名字,位置,第三,下来,t

    linux挂起任务命令?

    linux挂起任务命令?,系统,工作,信息,工具,地址,情况,暂停,数据,命令,进程,lin

    linux运行命令的脚本?

    linux运行命令的脚本?,系统,服务,工具,脚本,意外,技术,分析,文件,方法,命令,s

    linux进入挂起的命令?

    linux进入挂起的命令?,系统,标准,设备,工作,暂停,命令,状态,信息,名称,邮箱,L

    linux运行脚本的命令?

    linux运行脚本的命令?,系统,工具,代码,服务,脚本,状态,密码,环境,位置,暂停,l

    linux外部命令调用?

    linux外部命令调用?,系统,软件,标准,命令,盘中,管理,外部,进程,程序,内存,lin

    linux怎么调用命令行?

    linux怎么调用命令行?,系统,地址,工具,工作,首页,终端,命令,密码,信息,情况,l

    linux命令行运行中断?

    linux命令行运行中断?,连续,工作,系统,信息,程序,命令,设备,工具,网络,情况,L

    vim运行linux命令?

    vim运行linux命令?,系统,工作,信息,地址,命令,标准,时间,情况,工具,基础,linu

    linux下并行运行命令?

    linux下并行运行命令?,系统,服务,工作,命令,环境,网络,暂停,文件,脚本,参数,l

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    py调用linux的命令?

    py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,lin

    jar运行命令linux?

    jar运行命令linux?,项目,系统,平台,工具,上期,命令,选项,日志,文件名,目录,Li

    jar运行命令linux?

    jar运行命令linux?,项目,系统,平台,工具,上期,命令,选项,日志,文件名,目录,Li

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    linux下并行运行命令?

    linux下并行运行命令?,系统,服务,工作,命令,环境,网络,暂停,文件,脚本,参数,l

    py调用linux的命令?

    py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,lin

    linux系统命令调用?

    linux系统命令调用?,系统,单位,工具,工作,管理,地址,权威,密码,电脑,信息,怎

    linux调用上一条命令?

    linux调用上一条命令?,系统,命令,一致,数字,名称,网上,电脑,目录,空格,终端,l