Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 1
Регистрация: 27.08.2016
Сообщений: 37

Не работает async/await при обращении в базу по событию TabControl

12.10.2017, 16:09. Показов 1588. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается разобраться в ситуации, как и нагуглить ответ.
Вобщем есть TabControl по переключению вкладок которого вызывается событие SelectionChanged.
Некоторые из вкладок содержат в себе некие таблицы, данные которых при переходе на соответствующую вкладку надо обновить, получив актуальные данные из БД SQLite.

Выглядит это примерно так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private async void TcTabControl_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            SelectedTab = tcTabControl.SelectedIndex;
            await UpdateBySelectedTabAsync();
        }
 
public async Task UpdateBySelectedTabAsync()
        {
            if (SelectedTab == 1)
                await UpdateWPBindingAsync(From, WTo);
            else if (SelectedTab == 2)
                await UpdateVCBindingAsync(From, To);
            else if (SelectedTab == 3)
                await UpdateEvBindingAsync(From, To);
        }
 
private async Task UpdateWPBindingAsync(DateTime from, DateTime to)
{
         using (BuferDBContext dbContext = new BuferDBContext())
                {
                   
                    List<Statistic> buf = await Task.Run(() => { return dbContext.Statistics.ToList(); });
 
                    //код обновляющий привязанную к таблице ObservableCollection значениями списка buf
                }
}
методы UpdateBySelectedTabAsync и UpdateWPBindingAsync фактически находятся в классе ViewModel и здесь я просто упростил чтоб меньше лишнего кода было.

По идее при переходе на вкладку хочется получить мгновенно открывшуюся таблицу, которая заполнится после завершения await Task.Run(() => { return dbContext.Statistics.ToList(); });
Однако по факту всё выполняется синхронно. И пока не будут получены данные от базы данных UI висит.

Добавлено через 10 минут
создал тестовый WPF проект, где воспроизвёл ту же логику, но с долгим инкриментированием переменной вместо обращения к базе - всё работает как надо.

Добавлено через 42 минуты
искусственно увеличил время обращения к БД изменив асинхронный метод:
C#
1
2
3
4
5
List<WPSessionStatistic> bufWP = await Task.Run(() => {
                        long x = 0;
                        while (x < 4000000000)
                            x++;
                        return dbContext.WPSessionStatistics.ToList(); });
Оказалось, что await работает: вкладка открылась так же с задержкой, но без данных, которые подгрузились позже. То есть получается фриз организовывает не обращение к БД, а отрисовка содержимого вкладки: этой самой таблицы для данных. Таблица в свою очередь организована с использованием контрола syncfusion - будем искать
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2017, 16:09
Ответы с готовыми решениями:

Await/Async - не работает
Изучаю Async/Await. Есть программка, постоянно крутящийся статус-бар и две кнопки. При нажатии на первую - все как должно, асинхронно,...

Как работает async await?
Не могу понять как все же отрабатывает async await. Насколько я понимаю их работу сначала должен отрабоать &quot;Запуск асинхронной...

Node v7.9 async/await не работает. Что не так?
Всем привет. Использую node 7.9 и express. Вот код как пример: function mysql_execute(sql, props) { return new...

1
2 / 2 / 1
Регистрация: 27.08.2016
Сообщений: 37
20.10.2017, 13:40  [ТС]
ничего не понимаю.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private async Task UpdateWPBindingAsync(DateTime from, DateTime to)
        {
            
                List<WPSessionStatistic> bufWP = await Task.Run(() =>
                {
                    Task.Delay(5000);
                    List<WPSessionStatistic> l = null;
                    using (BuferDBContext dbContext = new BuferDBContext())
                    {
                        l = dbContext.WPSessionStatistics.ToList();
                    }
                    return l;
                });
}
 
//код по обновлению полученными от БД данными
хоть убейся работает синхронно и блокирует UI

Добавлено через 50 минут
вместо
C#
1
2
3
4
using (BuferDBContext dbContext = new BuferDBContext())
                    {
                        l = dbContext.WPSessionStatistics.ToList();
                    }
ставлю
C#
1
2
3
long x = 0;
                    while (x < 4000000000)
                        x++;
и всё работает прекрасно - во время выполнения задачи UI не блокируется, но стоит поставить в задаче не инкриментирование х, а обращение к базе данных и UI тут же виснет на время обращения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2017, 13:40
Помогаю со студенческими работами здесь

Использую async и await но асинхронность так и не работает
Добрый день. Глупый вопрос, но почему в данной коде не работает асинхронность? И что надо изменить чтобы заработала? private...

Async/ await как правильно ввести данные в async метод (консоль)
Привет , кто то может помочь ?) проблема в тому что у меня есть async метод который запускается из Main, по среди этого метода...

Async/await при работе с бд
Здравствуйте, вопрос в следующем. Допустим есть особая операция с базой данных, для которой нет async метода. Имеет ли смысл оборачивать...

Проблемы с конструкцией async\await при использовании WPF или Windows Forms
Добрый день! Написал библиотечку, использующую, в том числе конструкции async-await. Всё работает, при компиляции в виде консольного...

async/await
https://metanit.com/sharp/tutorial/13.7.php вот код Task&lt;T&gt;: // определение асинхронного метода static async...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru