2015-04-29 3 views
0

FileSystemWatcher настроен для обновления TreeView для отображения файлов в каталоге на диске. Он срабатывает, как ожидалось, и поиск через TreeView возвращает правильный узел, но когда я выдаю команду nodeToDelete.Remove(), я получаю следующую ошибку:Использование FileSystemWatcher для удаления Childnode из TreeView, получение ошибки «Неверный поток»

Необработанное исключение типа «Исправление System.InvalidOperationException» произошло в Системе .Windows.Forms.dll

Дополнительная информация: Работа с перекрестными потоками не действительна: Control '_tvwFiles' доступен из потока, отличного от потока, на котором он был создан.

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

Код выглядит следующим образом:

using System; 
using System.IO; 
using System.Windows.Forms; 

namespace WaveManager 
{ 
    public partial class FileViewControl : UserControl 
    { 
     public FileViewControl() 
     { 
      InitializeComponent(); 
     } 

     private FileSystemWatcher _watcher; 
     private const string path = @"c:\temp"; 

     public void OnWaveOpen(string fileName) 
     { 
     string filePath = Path.GetDirectoryName(fileName); 

     TreeNode folderNode; 
     _tvwFiles.ImageIndex = 0; 
     _tvwFiles.SelectedImageIndex = 0; 
     DirectoryInfo directoryInfo = new DirectoryInfo(filePath); 
     //folderNode = new TreeNode(directoryInfo.Name); 
     folderNode = new TreeNode(filePath); 
     folderNode.Tag = directoryInfo; 

     //Getfiles 
     TreeNode waveNode; 

     foreach (FileInfo wavefile in directoryInfo.GetFiles("*.wav")) 
     { 
      waveNode = new TreeNode(wavefile.Name, 1, 1); 
      waveNode.Name = waveNode.Text; 
      waveNode.Tag = wavefile; 
      folderNode.Nodes.Add(waveNode); 
      } 
      _tvwFiles.Nodes.Add(folderNode); 

      _tvwFiles.ExpandAll(); 
     } 

     private void OnLoad(object sender, System.EventArgs e) 
     { 
      if (DesignMode) 
       return; 
      _tvwFiles.ExpandAll();    
      _watcher = new FileSystemWatcher(path); 
      _watcher.EnableRaisingEvents = true; 
      _watcher.Deleted += OnFileDeleted; 

     } 

     private TreeNode FindNodeByTagText(String s, TreeNodeCollection nodes) 
     { 
      foreach (TreeNode node in nodes) 
      { 
       if (node.Tag.ToString() == s) 
        return node; 

       TreeNode n = FindNodeByTagText(s, node.Nodes); 
       if (n != null) 
        return n; 
      } 

      return null; 
     } 

     void OnFileDeleted(object sender, FileSystemEventArgs e) 
     { 
      string fn = Path.GetFileName(e.FullPath); 
      TreeNode nodeToDelete = FindNodeByTagText(fn, _tvwFiles.Nodes); 
      nodeToDelete.Remove(); 
     } 
    } 
} 

Все мысли были бы весьма признателен. Спасибо!

+0

возможно дубликат [операции Cross-нить не действительный: Контроль доступ из потока, отличного от резьбы она была создана] (http://stackoverflow.com/questions/142003/ кросс-нить-операция-не-действительный-контроль-доступ-с-а-нить-друг, чем на сообщении) –

ответ

1

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

Попробуйте установить

_watcher.SynchronizingObject = this; 

 Смежные вопросы

  • Нет связанных вопросов^_^