Подскажите пожалуйста, как исправить вывод информации в 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)
{
}
}
}
if (InvokeRequired) { Invoke(delegat, data); return; }– Digital Core Mar 17 '18 at 19:04