powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Async Loading от Стивена Клири
25 сообщений из 111, страница 1 из 5
Async Loading от Стивена Клири
    #39523497
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, решил попробовать асинхронно загрузить данные по аналогии с https://msdn.microsoft.com/ru-ru/magazine/dn605875.aspx.
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
///свойство ViewModel
 public NotifyTaskCompletion<List<item>>  itemsList{ get; set; }

//в конструкторе заполняем свойство


 public PersonsViewModel()
        {      
             itemsList = new NotifyTaskCompletion<List<item>>(initialitemlist());


 private async Task<List<item>> initialitemlist()
        {
            List<item> ListItemtemp_temp = new List<item>();

            string connectionString = "###";

            using (OracleConnection connection = new OracleConnection())
            {
                try
                {
                    connection.ConnectionString = connectionString;

                    using (OracleCommand command = connection.CreateCommand())
                    {        
                        string sql = $"sqlquery";

                        command.CommandText = sql;

                        if (connection.State != ConnectionState.Open)
                            await connection.OpenAsync().ConfigureAwait(false);

                        DbDataReader reader = await command.ExecuteReaderAsync().ConfigureAwait(false);
                        if (reader.HasRows)
                        {
                            while (await reader.ReadAsync().ConfigureAwait(false))
                            {
                                ListItemtemp.Add(new item
                                {
                                    property1 = Convert.ToString(reader["column1"]),
                                    property2 = Convert.ToDateTime(reader["column1"])
                                });
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    //MessageBox.Show(ex.Message);
                }
                finally
                {
                    if (connection.State == ConnectionState.Open)
                        connection.Close();
                }

                return ListItemtemp;
            }
        }
        }



Код: xml
1.
 ItemsSource="{Binding itemsList.Result ,IsAsync=True}"



В итоге при загрузке все равно визуальный интерфейс фризится. Когда ставлю брекпоинт на return ListItemtemp
, отладчик показывает, что выполнение происходит в основном потоке, хотя в примере из статьи- во второстепенном. У кого-то работал аналогичный подход корректно?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523573
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
Мне где то говорили что в wpf ленивая загрузка есть из коробки. Тогда не понял ваш сабж.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523577
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
20 сек открывается 60 килозаписей. Есть Lazy из коробки в платформе?
Но я пока приостановил тот сабж. Другие задачи поставили.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523578
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
Вы имеете ввиду скорее всего Priority Binding, но это когда нужно показать что-то, пока не загрузится основной Binding.Не знаю фризится при этом интерфейс или нет, но это к сожалению не то, что нужно.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523580
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
lazy это когда объект инициализируется при первой потребности в нем- соответственно все равно, когда лист item будет инициализироваться, то он заморозит интерфейс.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523591
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
"Показать что то, пока...", фризится, тормозит - это всё одно и то же. Разве нет?
Ты опиши задачу от пользователя.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523593
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sublazy
Да. Вроде решили, что это слово говорит о ленивой загрузке не основной коллекции, а чилдрен подчиненных объектов.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523595
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subрешил попробовать асинхронно загрузить данные
Один в один мой топик.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523740
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subВ итоге при загрузке все равно визуальный интерфейс фризится. Когда ставлю брекпоинт на return ListItemtemp, отладчик показывает, что выполнение происходит в основном потоке , хотя в примере из статьи- во второстепенном. У кого-то работал аналогичный подход корректно?А что, если вставить строку:
Код: c#
1.
2.
// Искусственная задержка, чтобы показать отзывчивость
    await Task.Delay(TimeSpan.FromSeconds(3)).ConfigureAwait(false);

Выполнение так и останется в основном потоке?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523768
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Асинхронное выполнение <> многопоточное.
попробуйте просто обернуть в свой Task, можно даже свой планировщик тогда определить
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523780
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,
тогда вообще дичь получается- программа падает в бесконечный цикл и будет бесконечно возвращать return через значение временной задержки (данные в UI не передаются). Когда смотрел статус задачи из примера то ее статус RunToCopletion, если же ставлю задержку в свой пример, то там все время статус WaitForActivation-то есть она не успевает запуститься.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523789
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>vb_sub, вчера, 21:32 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1271937&msg=20807374][20807374]
>...решил попробовать асинхронно загрузить данные ...
Посмотри здесь .

С уважением,
Владимир
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523803
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subrefreg,
тогда вообще дичь получается- программа падает в бесконечный цикл и будет бесконечно возвращать return через значение временной задержки (данные в UI не передаются). Когда смотрел статус задачи из примера то ее статус RunToCopletion, если же ставлю задержку в свой пример, то там все время статус WaitForActivation-то есть она не успевает запуститься.Ну попробуй время уменьшить до 1 милисекунды. Но это не решение твоей проблемы. Проблема глубже.

Когда ты вызываешь асинхронный метод, то нет никакой гарантии, что асинхронный метод создаст задачу на выполнение. Метод может выполняться синхронно.
Например, может быть такая логика - пробуем выполнить синхронно. Если за какое-то время ответ получить не удалось, создаем задачу.

У тебя в коде много быстрых асинхронных вызовов - и ты, не можешь быть уверен, что они вызываются действительно асинхронно.

В данном случае, тебе надо быть уверенным, что метод initialitemlist будет выполняться в отдельном потоке. Поэтому желательно, создать отдельный поток самому.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523805
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregПоэтому желательно, создать отдельный поток самому.
Это будет ещё на пару экранов кода.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523807
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesАсинхронное выполнение <> многопоточное
Везде где делал await смотрел в отладчике, код выполнялся не в потоке ГУИ.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523809
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123refregПоэтому желательно, создать отдельный поток самому.
Это будет ещё на пару экранов кода.Task.Factory.StartNew
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523815
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Roman MejtesАсинхронное выполнение <> многопоточное
Везде где делал await смотрел в отладчике, код выполнялся не в потоке ГУИ.ТС не обладает таким везением
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523816
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот смотрю, аффтар хочет не тормозя ГУИ загрузить свою коллекцию items для показа в ГУИ.
Вероятно сейчас загрузка у него секунд 15.
Получается руками надо в wpf писать такую фичу?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523821
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregТС не обладает таким везением дай ссылку как и кто определяет в потоке будет код или решит не надо).
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523823
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregTask.Factory.StartNew
У меня после wait разумеется метод:
Task myMetod {
Return Task.Run (
..
А как иначе))
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523828
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregКогда ты вызываешь асинхронный метод, то нет никакой гарантии, что асинхронный метод создаст задачу на выполнение.
Я так понял, ты про случай когда метод писал не ты сам. Ок.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523842
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refregКогда ты вызываешь асинхронный метод, то нет никакой гарантии, что асинхронный метод создаст задачу на выполнение. Метод может выполняться синхронно.
Вызывая Async метод мы в любом случае выполняем таск (задачу),
вопрос лишь в том, в каком потоке эта задача будет выполняться.
асинхронные операции могут выполняться в однопоточном приложении и много поточком. Им нет до этого никакого дела.
Асинхронной операцией называют ту, которая может прервать своё выполнение, а затем продолжить.
То есть, в рамках 1 потока, 2 асинхронные задачи будут работать не одновременно, а чередуясь друг с другом.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523845
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и сам по себе Task обеспечивает именно асинхронность, а за многопоточное выполнение тасков отвечает его планировщик. Именно планировщик запускает таски в пуле потоков, сами по себе они в других потоках выполняться не будут.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523848
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesТо есть, в рамках 1 потока, 2 асинхронные задачи будут работать не одновременно, а чередуясь друг с другом.
Очень прикольно.
Пример есть? Асинхронного вызова метода без потока?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523854
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть олдскульная тема с с Dispatcher.BeginInvoke и тд, чтобы избежать фриза интерфейса, но хз кто ей сейчас пользуется.
Одним из сдерживающим моментом является то, что длительная операция запускается из конструктора ViewModel, соответственно асинхронность на высшем уровне использовать нельзя- нужно переписывать на асинхронный конструктор.
Еще неопределенности добавляет неизвестность того, что фризит объект- сама длительная операция или рендеринг GUI- нужно лезть через Perforator, но это опять не получится потому что не успею сразу запустить и Perforator и рабочий процесс, соответственно нужно загрузку переносить на какую-то кнопку. В общем чтобы проверить нужно норм так всего переписать и не факт, что узнаешь истину. Обидно, что чел так накалывает с асинхронностью.
...
Рейтинг: 0 / 0
25 сообщений из 111, страница 1 из 5
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Async Loading от Стивена Клири
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]