为什么FileSystemWatcher关闭程序?

时间:2011-12-08 16:07:47

标签: c# visual-studio-2010 filesystemwatcher

我有:

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中,您可以转到调试菜单 - >例外。在此对话框中,确保在Common Language Runtime Exceptions旁边,确保勾选了“Thrown”和“User Unhandled”,单击OK并再次尝试调试。 - dash

5 个答案:

答案 0 :(得分:2)

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

<强>更新

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

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

答案 1 :(得分:2)

假设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);
}

答案 2 :(得分:1)

除了Justin的回答,还有Path属性的you can only specifiy a directory

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

还尝试添加一些异常处理或在调试模式下单步调试代码以查看发生的情况。请密切注意您如何设置标签,尽管我希望看到一个跨线程异常。

你有没有看到任何例外?

答案 3 :(得分:1)

什么是Text,以及事件发生时用它做了什么?

请记住FileSystemWatcher从线程池创建自己的线程来处理事件。此外,在此类的引擎下有大量非托管代码,如果您在调试器选项中打开了“Just My Code”,则可能导致无法处理的异常被静默吞噬。

您可能想要创建一个生产者/消费者模型来处理这个问题 - 有关详细信息,请参阅After FileSystemWatcher fires - Thread Pool or Dedicated thread?

答案 4 :(得分:-1)

是Windows服务吗? 通常,如果文件观察者无法找到该文件夹​​或无法访问文件夹,它就会死亡。 你检查了你的EventLog吗?