@Vamba45

При выполнении асинхронного метода вылезает ошибка, в чём проблема?

Код WPF
<Button Content="Button" Canvas.Left="81" Canvas.Top="176" Click="Button_Click"/>
        <Label Name="label1" Content="Label" Canvas.Left="81" Canvas.Top="128"/>

Код C#
private async void Button_Click(object sender, RoutedEventArgs e)
        {
            await Task.Run( () => 
            { 
                for (int i = 0; i < 101; i++)
                {
                    label1.Content = i.ToString();
                    Thread.Sleep(1000);
                }
            });
        }


При нажатии кнопки вылезает исключение:

System.InvalidOperationException: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."

А также оповещение от VS: Чтобы предотвратить небезопасное прерывание при вычислении функции "System.Windows.Controls.Control.ToString", было разрешено запускать все потоки. Это могло изменить состояние процесса, и все обнаруженные точки останова были пропущены.
  • Вопрос задан
  • 2176 просмотров
Решения вопроса 1
twobomb
@twobomb
Потому-что ты пытаешься получит доступ к контролу из другого потока, используй инвок
private async void Button_Click(object sender, RoutedEventArgs e)
        {
            await Task.Run( () => 
            { 
                for (int i = 0; i < 101; i++)
                {
Dispatcher.Invoke((Action)(() =>
            {
                    label1.Content = i.ToString();
            }));
                    Thread.Sleep(1000);
                }
            });
        }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы