Обновление панели с использованием асинхронного метода для оперативной информации на метку или другое - PullRequest
0 голосов
/ 07 июня 2019

Я пишу веб-приложение, и иногда процесс запускается в течение нескольких секунд. В этом случае мне нужно обновить страницу, чтобы показать, что процесс все еще работает. то есть вызов базы данных и т. д., однако, я не могу получить элемент управления для обновления несколько раз. Например, метка для обновления каждую секунду, т. Е. Стадия 1, стадия 2 и т. Д. (Чисто для проверки прочитанного кода - это хранимая процедура, которая возвращает результат)

Я обернул элементы управления внутри обычной панели обновлений с помощью диспетчера сценариев на странице, я попытался связать элемент управления кнопки в качестве триггера с панелью обновления, однако я могу только когда-либо показать конечный результат. например, я установлю label.text = "case 1" и тем же методом для проверки задержки на 1 секунду, а затем снова обновлю метку. Это работает в настольных средах c #, таких как WPF и т. Д., Но не в ASP.NET со страницей aspx и кодом позади.

    protected async void btnTakeTime_Click(object sender, EventArgs e)
    {
        //Button press we await each call which in turn lets the label
        await TimeTaker(1);
        await TimeTaker(2);
        await TimeTaker(3);
        await TimeTaker(4);
        await TimeTaker(5);
    }

    private async Task<int> TimeTaker(int setting)
    {
        switch (setting)
        {
            case 1:
                LabelInfo.Text = "case 1";
                break;
            case 2:
                LabelInfo.Text = "case 2";
                break;
            case 3:
                LabelInfo.Text = "case 3";
                LabelInfo.CssClass = "text-info";
                break;
            case 4:
                LabelInfo.Text = "case 4";
                LabelInfo.CssClass = "text-warning";
                break;
            case 5:
                LabelInfo.Text = "case 5";
                LabelInfo.CssClass = "text-warning";
                break;
        }
        //Delay the return so we have time to see the updated label on the web page.
        await Task.Delay(1000);
        return 1;
    }

Это просто быстрый пример, но я ожидаю, что при нажатии кнопки при вызове каждого метода он будет обновлять метку, и это можно увидеть на экране как внутри панели обновления. он достигает точек останова, как и ожидалось, но метка не обновляется до последнего метода, в результате чего для метки с новым классом css устанавливается «case 5».

1 Ответ

0 голосов
/ 10 июня 2019

Согласно документации , единственный способ выполнить асинхронный код - использовать асинхронные задачи на странице.

Тем не менее, btnTakeTime_Click вернется после первого ожидания блокировки (await Task.Delay(1000);),Состояние LabelInfo будет зависеть от того, сколько времени потребуется для выполнения асинхронного кода и сколько времени занимает выполнение страницы (которая не знает, что этот код выполняется).

Кроме того, ничего этогоизменяет протокол HTTP (1.0 / 1.1) или работу веб-форм, которые представляют собой запрос, устанавливаемый агентом пользователя на сервер и сервер, отправляющий запрос обратно.Независимо от того, сколько раз состояние LabelInfo изменяется во время обработки запроса, оно будет иметь только конечное состояние.

...