1

ребята! Помогите подружиться с Visual Studio! Она меня ругает! Пишу прогу на Windows Forms. На форме button and label. Как из асинхронного метода изменять свойства элементов на форме? Нужно изменить текст в label1... или любом другом элементе формы.

private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "Start")
            {
                button1.Text = "Stop";
                Method();
            }
            else
            {
                button1.Text = "Start";
            }
        }
        async void Method()
        {
            await Task.Run(() =>
            {
                while (button1.Text == "Stop")
                {
                    Thread.Sleep(1000);
                    label1.Text += "\n" + DateTime.Now.ToString();
                }
            });

        }

Ругается на строку

label1.Text += "\n" + DateTime.Now.ToString();

http://prntscr.com/rvyreg Сама форма имеет такой вид: http://prntscr.com/rvz64t

Eltar
  • 19
  • 2
  • Нельзя менять элементы на форме в другом потоке. Имеется метод Form.Invoke() (параметр как в методе Task.Run(), вызывать так: this.Invoke(), потому что this - это указатель на текущую форму). все изменения контролов нужно оборачивать им (в данном случает только строчку label1.Text=...), тогда эти изменения ставятся в очередь на выполнение в основном потоке. – Алексей Обухов Apr 09 '20 at 10:32
  • Если пройти по ссылке выше, то там рекомендуется использовать BeginInvoke (в отличии от Invoke это ассинхронный метод, т.е. таск не будет ждать его окончания, а закончит свою работу). Чтоб не искать вот нужная выжимка из ссылки выше: this.BeginInvoke((MethodInvoker)(() => { label1.Text += "\n" + DateTime.Now.ToString(); })); – Алексей Обухов Apr 09 '20 at 10:50
  • Не очень понятно, если честно. Мне-то нужно открыть параллельный поток и выполнять асинхронно какие-то действия + изменения контроллов из него. Плюс параллельно чтобы элементы формы были доступны пользователю. Чтобы не вешалась прога. Кликнул кнопку Start, запустился фоновый процесс, выполняется. Параллельно человек может кликнуть на другую кнопку, которая меняет другие контролы, т.е. первый процесс не вешает всю прогу. – Eltar Apr 09 '20 at 14:21
  • Вот например две кнопки, вписал в одну из них Вашу реализацию кода. Клик на первую кнопку вешает программу. private void button1_Click(object sender, EventArgs e) { this.BeginInvoke((MethodInvoker)(() => { while(true) { label1.Text += "\n" + DateTime.Now.ToString(); } })); } private void button2_Click(object sender, EventArgs e) { button2.Text = "хаюшки"; } – Eltar Apr 09 '20 at 14:21

0 Answers0