Всем привет! Часто при разработки на winform приходится изобретать велосипед, так как некоторые контролы ведут себя не так как мы ожидаем. К примеру у нас есть некий поток, в котором происходит какие то вычисления или работа, поток может быть да же бесконечным циклом, это не имеет значения. Как же нам отправить значения в Label или TextBox из этого потока? Есть множество вариантов, но мы с вами используем Invoke, именно этот пример я использую в своих проектах.
Если вы видите подобную ошибку System.InvalidOperationException: «Недопустимая операция в нескольких потоках: попытка доступа к элементу управления ‘lbThread’ не из того потока, в котором он был создан.»
То воспользовавшись моим примером вы сможете от нее избавится.
Пример того как можно вывести информацию из другого потока в Label или TextBox на C#.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp12 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private async void BtnStart_Click(object sender, EventArgs e) { new Thread(this.Work1).Start(); await Task.Run(Work2); } void Work1() { int count = 0; while (true) { Thread.Sleep(500); lbThread.Invoke((Action)delegate { lbThread.Text = count.ToString();}); count++; } } void Work2() { int count = 0; while (true) { Thread.Sleep(500); txtBoxAsync.Invoke((Action)delegate { txtBoxAsync.Text = count.ToString(); }); count++; } } } } |
Привожу полный пример кода приложения и то как он работает: