对于我的项目,我需要触发一个方法,在给定目录中创建文件后更改某些文本框中的文本。
因此,我使用了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,但我从未创建过另一个线程...
有趣的是,我还有一个按钮可以手动完成整个操作(所以手动打开文件),它在那里工作得很好。
你能告诉我为什么它在另一个线程或我如何解决它?
由于
答案 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将在一个单独的线程上运行,因此不要尝试从另一个线程读取路径,只需在目录中执行查找并查看已更改的内容。对不起,所以无法给出完整的答案。