为什么FileSystemWatcher正在关闭程序

本文关键字:关闭程序 FileSystemWatcher 为什么 | 更新日期: 2023-09-27 18:17:06

我有:

using System.IO;
using System.Windows.Forms;
namespace myNamespace1
{
    public partial class Form1 : Form
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        public Form1()
        {
            InitializeComponent();
            watcher.Path = @"c:'users'Me'desktop'z";
            watcher.Created += new FileSystemEventHandler(watcher_Created);
            watcher.EnableRaisingEvents = true;
        }
        void watcher_Created(object sender, FileSystemEventArgs e)
        {
            Text = e.Name + " " + e.ChangeType.ToString();
        }
    }
}

当我添加一个文件夹或文件到文件夹(-z) -程序关闭。为什么?

我在调试模式下运行。vs

没有异常编辑:

答案:

jon-skeet的回答

+(在注释中)

在Visual Studio中,您可以转到Debug菜单-> Exceptions。在此对话框中,确保在公共语言运行时异常旁边,确保选中"抛出"answers"用户未处理",单击"确定"并再次尝试调试。- dash

为什么FileSystemWatcher正在关闭程序

假设Text试图更改UI属性,您正在从错误的线程更改UI。FileSystemWatcher在线程池线程上引发事件,但您只打算从UI线程访问UI。这可能会在线程池线程中抛出一个异常,从而使进程中断。

试试这个:

void watcher_Created(object sender, FileSystemEventArgs e)
{
    Action action = () => Text = e.Name + " " + e.ChangeType;
    // Or Dispatcher.Invoke - it depends on your application type
    Invoke(action);
}

在不知道您创建的程序类型的详细信息的情况下,我猜您的代码中有一个未处理的异常发生,导致您的应用程序关闭。

看了你的编辑,看起来Jon是正确的(和往常一样)。您的应用程序试图在错误的线程上更新Text属性。你的处理器应该是:

Action a = () => e.Name + " " + e.ChangeType.ToString();
Invoke(a);

除了Justin的回答,您只能为Path属性指定一个目录。

要监视特定文件的更改,请使用Filter属性。

还可以尝试添加一些异常处理或在调试模式下逐步执行代码以查看发生了什么。密切注意你是如何设置标签的,尽管我希望看到一个跨线程异常。

你看到任何异常吗?

什么是Text,当事件发生时它做了什么?

请记住,FileSystemWatcher从线程池中创建自己的线程来处理事件。此外,在这个类的底层有大量的非托管代码,如果你在调试器选项中打开了"Just My code",这可能会导致未处理的异常被无声地吞下。

你可能想创建一个生产者/消费者模型来处理这个问题——参见FileSystemWatcher触发后——线程池还是专用线程?

是windows服务吗?通常,如果文件监视程序找不到文件夹或无法访问文件夹,它就会死亡。你检查过EventLog了吗?