InvalidOperationException при назначении текста в TextField - PullRequest
5 голосов
/ 25 июня 2010

У меня странная проблема с C #, я пока не могу объяснить.На самом деле я планировал создать простую программу просмотра файлов, которая автоматически обновляет отображаемый текст, как только файл будет изменен, но это оказывается более сложным, чем я думал.1004 *

Теперь присвоение TextField (WPF) в измененном обработчике вызывает исключение System.InvalidOperationException, сообщающее, что объект уже используется в другом потоке.Так почему я получаю это исключение и, что более важно, что мне нужно сделать, чтобы это работало?

edit

Кстати, я получаю исключение независимо от строки, которую яm назначение.

edit2

Полный текст исключения, но на немецком языке:

System.InvalidOperationException wurde nicht behandelt.
  Message="Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet."
  Source="WindowsBase"
  StackTrace:
       bei System.Windows.Threading.Dispatcher.VerifyAccess()
       bei System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
       bei System.Windows.Controls.TextBox.set_Text(String value)
       bei LiveTextViewer.Main.watcher_Changed(Object sender, FileSystemEventArgs e) in ...\Main.xaml.cs:Zeile 42.
       bei System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* overlappedPointer)
       bei System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
  InnerException:

1 Ответ

6 голосов
/ 25 июня 2010

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

Вам нужно будет использовать Dispatcher, чтобы отправить вызов, который возвращает текст обратно в поток пользовательского интерфейса:

void watcher_Changed(object sender, FileSystemEventArgs e)
{
    String text = File.ReadAllText(e.FullPath);

    this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => 
        {
             this.txtFile.Text = text;
             // Do all UI related work here...
        }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...