跨线程操作无效:从创建它的线程以外的线程访问控制

时间:2009-08-30 13:22:15

标签: file-io

我正在编写一个filewatcher windows应用程序,它将查找指定文件夹中的更改,然后将详细信息记录在txt文件中。

我完全按照下面这篇文章中提到的内容 http://www.codeproject.com/KB/dotnet/folderwatcher.aspx

当我从我的应用程序中点击F5然后在正在观看的文件夹中创建或修改文件时,它会抛出下面提到的错误。

请帮忙

跨线程操作无效:控制'txtFolderActivity'从其创建的线程以外的线程访问。

3 个答案:

答案 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