Пользовательский интерфейс обновления WPF из асинхронного метода - PullRequest
0 голосов
/ 11 мая 2018

На публике MainWindow() звоню TestTask3(10000);. Текст TextBlock обязательно должен ответить в XAML. Вызывается get и отображается начальное значение. Я вижу set вызов NotifyPropertyChanged. Но get не вызывается второй раз, чтобы получить новое значение. У меня также есть кнопка, которая меняет ответ и это меняет TextBlock.

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

private int answser = -2;
public int Answer
{
    get { return answser; }
    set
    {
        if (answser != value)
        {
            answser = value;
            NotifyPropertyChanged("Answer");
        }
    }
}
public async void TestTask3(int delay)
{
    Debug.WriteLine($"TestTask3");
    int answer = -1;
    int i = await Task.Run(() =>
    {
        // … do compute-bound work here  
        Task.Delay(delay);
        answer = -1;
        return answer;
    });
    Debug.WriteLine($"TestTask3   {i}");
    Answer = answer;
    //return answer;
}

1 Ответ

0 голосов
/ 11 мая 2018

Task.Delay(delay) является приемлемым методом.

Следующее решение работает для меня. Я взял расчеты с длинным циклом, и через 10 секунд он возвращает результат в пользовательском интерфейсе. Проверено и работает.

public async void TestTask3(int delay)
{
    int answer = -1;
    int i = await Task.Run(async () =>
    {
        // … do compute-bound work here  
        for (int j = 0; j < 100000000; j++)
        {
            answer += j;
        }

        await Task.Delay(delay);

        //answer = -1;
        return answer;
    });
    Answer = answer;
    //return answer;
}

Использование:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    await TestTask3(10000);
}
...