Member 13158148 Ответов: 1

Как использовать задачу для отображения отложенного текста


Я делаю несколько простых тестов с Task. Run в C# 5.0. Я создал форму с кнопкой и меткой, чтобы проверить ее. Должно быть, это довольно просто, но до сих пор не получалось.

Как я могу записать задержку в метку, не блокируя пользовательский интерфейс ?

Вот мой пример кода:
private void Button_Click(object sender, EventArgs e)
{
    writeStatus("test 1");
}

private Task taskWriteStatus(string text)
{
    return Task.Run (() =>
    {
        labelWrite(text);
    }); 
}

private void labelWrite(string text)
{
    Task.Delay(300).Wait();
    label1.Text = text;
}

private async void writeStatusAsync (string text)
{
    await taskWriteStatus(text);
}


Что я уже пробовал:

Я провел некоторые исследования и нашел различные подходы к решению этой проблемы, как эта хорошая статья:
https://blog.imaginea.com/elegant-c-asynchrony/

1 Ответов

Рейтинг:
9

VR Karthikeyan

Привет, вы не можете получить доступ к потоку пользовательского интерфейса сразу из другого потока, поток пользовательского интерфейса имеет самый высокий приоритет. Для этого вам нужно использовать диспетчер.

просто измените свой labelWrite(строковый текст) метод,

private void labelWrite(string text)
{
    Task.Delay(10000).Wait();
    this.Invoke(new MethodInvoker(delegate ()
    {
        label1.Text = text;
    }));
}

И этот метод вызывается в нажатием кнопки. Всегда старайтесь использовать dispatcher, когда вам нужно обновить пользовательский интерфейс из потоков.