创建FileSystemWatcher后访问WindowsForms的问题

时间:2017-09-15 16:21:28

标签: c# multithreading

对于我的项目,我需要触发一个方法,在给定目录中创建文件后更改某些文本框中的文本。

因此,我使用了FileSystemWatcher并添加了一个EventHandler,如下所示:

private void watch()
    {

        watcher = new FileSystemWatcher();
        watcher.Path = path;
        watcher.Filter = "*.osr";
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.EnableRaisingEvents = true;
    }

创建文件后,FileSystemWatcher成功触发该方法,但是当我想访问文本框时会引发错误。

textBox.Text = path; //Error here

错误是:“System.InvalidOperationException”,它说,我正在尝试从另一个线程访问WindowsForms,但我从未创建过另一个线程...

有趣的是,我还有一个按钮可以手动完成整个操作(所以手动打开文件),它在那里工作得很好。

你能告诉我为什么它在另一个线程或我如何解决它?

由于

2 个答案:

答案 0 :(得分:2)

目前,您的FileSystemWatcher位于一个线程上,而您的UI位于另一个线程上。

您需要使用BeginInvoke调用它,因此它将被管理"在您的UI的同一个线程。

这样的事情:

public partial class Form1 : Form
{
    delegate void FileCreationUpdater(FileSystemEventArgs evt);
    FileSystemWatcher watcher = null;
    public Form1()
    {
        InitializeComponent();

        // instantiate a new FileSystemWatcher
        watcher = new FileSystemWatcher(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
        {
            // and starts it right away
            EnableRaisingEvents = true
        };

        // create a new updater delegate 
        FileCreationUpdater updater = new FileCreationUpdater(TextBoxUpdater);

        // when receiving Created events, Invoke updater.
        watcher.Created += (s, e) =>
        {
            /// passing parameter to the invoked method
            textBox1.BeginInvoke(updater, e);
        };
    }

    public void TextBoxUpdater(FileSystemEventArgs evt)
    {
        /// update path
        textBox1.Text = evt.FullPath;
    }
}

答案 1 :(得分:0)

FileSystemWatcher将在一个单独的线程上运行,因此不要尝试从另一个线程读取路径,只需在目录中执行查找并查看已更改的内容。对不起,所以无法给出完整的答案。