LINUX.ORG.RU

C# async await доступ к UI из потока

 , , , ,


0

2

Здравствуйте, помогите разобраться, я не программист C# и мне с трудом дается разобраться с некоторыми моментами.

Значит, есть у меня форма, в которой всего один элемент UI это - label1, а так же метод myFunc() и его асинхронный вызов myFuncAsync.

Ну вот так:

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MyProject
{
    public partial class FormTest : Form
    {
        public FormTest()
        {
            InitializeComponent();
        }

        // Простой статический метод
        public static void bar()
        {
            MessageBox.Show("Hello dude ;)");
        }

        // Загрузка формы
        private void FormTest_Load(object sender, EventArgs e)
        {
            myFuncAsync();
        }


        // Функция которая будет выполняться в отдельном потоке
        private void myFunc()
        {
            Thread.Sleep(2000);
            FormTest.bar();

            label1.Text = "Brorororor"; // КАК ТУТ ПОЛУЧИТЬ ДОСТУП К ЭЛЕМЕНТУ UI ????????
        }

        // Асинхронный вызов myFunc
        private async void myFuncAsync()
        {
            Task task = new Task(myFunc);
            task.Start();
            await task;
        }
    }
}

Все работает, кроме доступа к UI из потока. Выхватываю понятное исключение:

Исключение типа "System.InvalidOperationException" возникло в System.Windows.Forms.dll, но не было обработано в коде пользователя

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'label1' не из того потока, в котором он был создан.

Как мне с потока до UI достучаться?

Спасибо.

Ответ на: комментарий от xperious

Ух ты) так просто) спасибо! Заработало)

httpxss
() автор топика
Ответ на: комментарий от xperious

Подскажите как вернуть значение и продолжить код (ну есть тапа callback-а или что-то в этом духе)

private void Form1_Load(object sender, EventArgs e)
        {
            Task<string> test = testFnAsync();
            label1.Text = test.Result;
        }

        private void testFn()
        {
            Thread.Sleep(2000);
            label1.Invoke((MethodInvoker)(() => label1.Text = "Brorororor"));
            Thread.Sleep(1000);
        }

        private async Task<string> testFnAsync()
        {
            Task task = new Task(testFn);
            task.Start();
            await task;

            return "br11111111";
        }

httpxss
() автор топика
Ответ на: комментарий от httpxss

я не шарю совсем... очень смутно что-то помню но ты ресурсом ошибся, по шарпу на стековерфлоу махом отвечают

xperious ★★
()
Ответ на: комментарий от httpxss

Продолжая умничания. А ведь в C# не может быть stack overflow, чего тогда шарписты забыли на том ресурсе?

Deleted
()

я тоже не программист до-диез. какого хрена тег стоит С++? уберите левые теги из этого хлама.

Iron_Bug ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.