Недопустимая операция между потоками: доступ к элементу управления из потока, отличного от потока, в котором он был создан - PullRequest
7 голосов
/ 30 августа 2009

Я пишу приложение Windows FileWatcher, которое будет искать изменения в указанной папке, а затем записывает детали в текстовый файл.

Я точно следовал тому, что упоминается в этой статье ниже http://www.codeproject.com/KB/dotnet/folderwatcher.aspx

Когда я нажимаю F5 из своего приложения, а затем создаю или изменяю файл в папке, за которой следят, он выдает нижеупомянутую ошибку.

Пожалуйста, помогите

Операция с несколькими потоками недопустима: элемент управления txtFolderActivity доступен из потока, отличного от потока, в котором он был создан.

Ответы [ 3 ]

10 голосов
/ 30 августа 2009

Вы должны использовать метод Invoke в форме, например. с анонимным делегатом для внесения изменений в реакцию на событие.

Обработчик события вызывается с другим потоком. Этот 2-й поток не может получить доступ к элементам управления в вашей форме. Он должен «вызвать» их, чтобы позволить потоку выполнить всю управляющую работу, которая их изначально создала.

Вместо:

myForm.Control1.Text = "newText";

Вы должны написать:

myForm.Invoke(new Action(
delegate()
{
  myForm.Control1.Text = "newText";
}));
4 голосов
/ 30 августа 2009

Вы пытаетесь обновить пользовательский интерфейс из не-пользовательского потока. Пользовательский интерфейс имеет сходство с потоком и может обновляться только из потока, который его создал. Если вы используете WinForms, ознакомьтесь с Как: сделать потокобезопасные вызовы в Windows Forms Controls Статья MSDN. В основном вам нужно будет обновить пользовательский интерфейс с помощью метода Control.Invoke . Для WPF вам необходимо использовать DispatcherObject .

1 голос
/ 30 августа 2009

В основном у вас должно быть по крайней мере два потока в приложении, и поток, на котором работает ваша логика управления, отличается, поэтому вы получаете эту ошибку, так как элементы управления не являются потокобезопасными.

Это необходимо для защиты от проблем, которые могут быть вызваны тем, что несколько потоков одновременно изменяют один и тот же элемент управления.

Вы можете найти значительно больше деталей, посмотрев здесь: http://msdn.microsoft.com/en-us/library/ms171728%28VS.80%29.aspx

...