0

Подскажите пожалуйста, как исправить вывод информации в RichTextBox из другого потока. Выходит ошибка: System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'richTextBox1' не из того потока, в котором он был создан."

Нашел что-то про Invoke, не получилось никак исправить. Гуглю уже пол дня( P.S. В C# еще чайник, не судите строго. P.P.S. В MessageBox выводит без проблем.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using FastSearchLibrary;

namespace FastFoodDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            SidePanel.Height = button1.Height;
            SidePanel.Top = button1.Top;
            this.MouseDown += new MouseEventHandler((o, e) =>
            {
                base.Capture = false;
                Message m = Message.Create(base.Handle, 0xA1, new IntPtr(2), IntPtr.Zero);
                this.WndProc(ref m);
            });
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SidePanel.Height = button1.Height;
            SidePanel.Top = button1.Top;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            SidePanel.Height = button2.Height;
            SidePanel.Top = button2.Top;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            SidePanel.Height = button3.Height;
            SidePanel.Top = button3.Top;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            SidePanel.Height = button4.Height;
            SidePanel.Top = button4.Top;
        }


        private void button13_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }


        private void button8_Click_1(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }

        private void button9_Click(object sender, EventArgs e)
        {
            CancellationTokenSource tokenSource = new CancellationTokenSource();

            FileSearcher searcher = new FileSearcher(@"C:\", (f) => Regex.IsMatch(f.Name, @"*.txt"), tokenSource);

            List<FileInfo> files = new List<FileInfo>(); // список результатов

            object locker = new object();
            searcher.FilesFound += (sndr, arg) =>
            {
                lock (locker)
                {
                    arg.Files.ForEach((f) =>
                    {
                        files.Add(f); // добавляем результаты в список
                        richTextBox1.AppendText($"Расположение: {f.FullName}, \nДата создания: {f.CreationTime}");
                        //MessageBox.Show($"File location: {f.FullName}, \nCreation.Time: {f.CreationTime}");
                    });

                    if (files.Count >= 10)
                        searcher.StopSearch(); // останавливаем поиск досрочно
                }
            };

            searcher.SearchCompleted += (sndr, arg) =>
            {
                if (arg.IsCanceled)
                    MessageBox.Show("Search stopped.");
                    //richTextBox1.AppendText("Поиск остановлен");
                else
                    MessageBox.Show("Search completed.");
                    //richTextBox1.AppendText("Поиск завершён");

                MessageBox.Show($"Quantity of files: {files.Count}");
                //richTextBox1.AppendText($"Найдено файлов: {files.Count}");
            };

            var task = searcher.StartSearchAsync();

            task.Wait();
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
VladD
  • 206,799
Xhonor
  • 25
  • if (InvokeRequired) { Invoke(delegat, data); return; } – Digital Core Mar 17 '18 at 19:04
  • Покажите что именно пробовали с Invoke. Хотя, идея выводить в richTextBox1 данные по ходу поиска достаточно сомнительная - вывод будет занимать больше времени, чем сам поиск –  Mar 17 '18 at 20:21

0 Answers0