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();
}
}
}
Все мысли были бы весьма признателен. Спасибо!
возможно дубликат [операции Cross-нить не действительный: Контроль доступ из потока, отличного от резьбы она была создана] (http://stackoverflow.com/questions/142003/ кросс-нить-операция-не-действительный-контроль-доступ-с-а-нить-друг, чем на сообщении) –