Недопустимая операция в нескольких потоках - C# (216595)
Формулировка задачи:
Че-то в соседнем разделе никто не откликнулся, так что спрошу здесь.
Что-то непонятное происходит - пишу прогу с использованием FileSystemWatcher, при срабатывании любого его события выскакивает ошибка "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "listBox1" не из того потока, в котором он был создан."
на строке кода
на строке кода
Хотя прогу многопоточную не пишу. Что посоветуете сделать? Вот полный текст кода:
listBox1.Items.Add(dt.ToLocalTime() + " " + rea.ChangeType.ToString() + rea.OldFullPath + "to " + " " + rea.FullPath);
public partial class Form1 : Form { [DllImport("user32.dll")] public static extern bool MessageBeep(int Sound); FileSystemWatcher watcher = new FileSystemWatcher(); public Form1() { InitializeComponent(); textBox1.Text = "D:\\"; textBox2.Text="*.*"; } private void button2_Click(object sender, EventArgs e) { watcher.EnableRaisingEvents = false; } private void button1_Click(object sender, EventArgs e) { //if (watcher.EnableRaisingEvents == true) //{ // MessageBeep(100); // return; //} listBox1.Items.Clear(); watcher.Path = textBox1.Text; watcher.Filter = textBox2.Text; watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Attributes | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size; if (checkBox2.Checked == true) watcher.Changed += new FileSystemEventHandler(OnFileEvent); else watcher.Changed -= new FileSystemEventHandler(OnFileEvent); if (checkBox4.Checked == true) watcher.Created += new FileSystemEventHandler(OnFileEvent); else watcher.Created -= new FileSystemEventHandler(OnFileEvent); if (checkBox5.Checked == true) watcher.Deleted += new FileSystemEventHandler(OnFileEvent); else watcher.Deleted -= new FileSystemEventHandler(OnFileEvent); if (checkBox3.Checked == true) watcher.Renamed += new RenamedEventHandler(OnRenameEvent); else watcher.Renamed -= new RenamedEventHandler(OnRenameEvent); if (checkBox1.Checked == true) watcher.IncludeSubdirectories = true; else watcher.IncludeSubdirectories = false; watcher.EnableRaisingEvents = true; } public void OnFileEvent(object source, FileSystemEventArgs fsea) { DateTime dt = new DateTime(); dt = System.DateTime.UtcNow; listBox1.Items.Add(dt.ToLocalTime() + " " +fsea.ChangeType.ToString() + " " + fsea.FullPath); MessageBox.Show("Event"); } public void OnRenameEvent(Object source, RenamedEventArgs rea) { DateTime dt = new DateTime(); dt = System.DateTime.UtcNow; listBox1.Items.Add(dt.ToLocalTime() + " " + rea.ChangeType.ToString() + rea.OldFullPath + "to " + " " + rea.FullPath); MessageBox.Show("Rename"); } private void button3_Click(object sender, EventArgs e) { Application.Exit(); } }
Решение задачи: «Недопустимая операция в нескольких потоках»
textual
Листинг программы
public void f1() { if (listBox1.InvokeRequired) { MethodInvoker mi = delegate { f1(); }; listBox1.Invoke(mi); } else { listBox1.Items.Add(dt.ToLocalTime() + " " + rea.ChangeType.ToString() + rea.OldFullPath + "to " + " " + rea.FullPath); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д