Недопустимая операция в нескольких потоках - 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);
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5
Похожие ответы