我正在编写一个filewatcher windows应用程序,它将查找指定文件夹中的更改,然后将详细信息记录在txt文件中。
我完全按照下面这篇文章中提到的内容 http://www.codeproject.com/KB/dotnet/folderwatcher.aspx
当我从我的应用程序中点击F5然后在正在观看的文件夹中创建或修改文件时,它会抛出下面提到的错误。
请帮忙
跨线程操作无效:控制'txtFolderActivity'从其创建的线程以外的线程访问。
答案 0 :(得分:10)
您必须在表单上使用Invoke方法,例如与匿名代表一起对事件作出反应。
使用另一个线程引发事件处理程序。第二个线程无法访问表单中的控件。它必须“调用”它们让线程完成所有控制最初创建它们的工作。
而不是:
myForm.Control1.Text = "newText";
你必须写:
myForm.Invoke(new Action(
delegate()
{
myForm.Control1.Text = "newText";
}));
答案 1 :(得分:4)
您正在尝试从非UI线程更新UI。 UI具有线程关联性,只能从创建它的线程更新。如果您使用的是WinForms,请查看How to: make thread-safe calls to Windows Forms Controls MSDN文章。基本上,您需要通过Control.Invoke方法更新UI。对于WPF,您需要使用DispatcherObject。
答案 2 :(得分:1)
基本上你的应用程序必须有两个线程,至少你的控制逻辑所在的线程是不同的,所以你得到这个错误,因为控件不是线程安全的。
这是为了保护您免受多个线程同时更改同一控件可能导致的问题。
您可以在此处查找更多详细信息: http://msdn.microsoft.com/en-us/library/ms171728%28VS.80%29.aspx