Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Async Loading от Стивена Клири / 25 сообщений из 111, страница 1 из 5
19.09.2017, 21:32
    #39523497
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Loading от Стивена Клири
Всем привет, решил попробовать асинхронно загрузить данные по аналогии с 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
20.09.2017, 08:13
    #39523573
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Loading от Стивена Клири
vb_sub,
Мне где то говорили что в wpf ленивая загрузка есть из коробки. Тогда не понял ваш сабж.
...
Рейтинг: 0 / 0
20.09.2017, 08:25
    #39523577
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Loading от Стивена Клири
vb_sub,
20 сек открывается 60 килозаписей. Есть Lazy из коробки в платформе?
Но я пока приостановил тот сабж. Другие задачи поставили.
...
Рейтинг: 0 / 0
20.09.2017, 08:25
    #39523578
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Loading от Стивена Клири
Petro123,
Вы имеете ввиду скорее всего Priority Binding, но это когда нужно показать что-то, пока не загрузится основной Binding.Не знаю фризится при этом интерфейс или нет, но это к сожалению не то, что нужно.
...
Рейтинг: 0 / 0
20.09.2017, 08:27
    #39523580
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Loading от Стивена Клири
Petro123,
lazy это когда объект инициализируется при первой потребности в нем- соответственно все равно, когда лист item будет инициализироваться, то он заморозит интерфейс.
...
Рейтинг: 0 / 0
20.09.2017, 09:07
    #39523591
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Loading от Стивена Клири
vb_sub,
"Показать что то, пока...", фризится, тормозит - это всё одно и то же. Разве нет?
Ты опиши задачу от пользователя.
...
Рейтинг: 0 / 0
20.09.2017, 09:10
    #39523593
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Loading от Стивена Клири
vb_sublazy
Да. Вроде решили, что это слово говорит о ленивой загрузке не основной коллекции, а чилдрен подчиненных объектов.
...
Рейтинг: 0 / 0
20.09.2017, 09:12
    #39523595
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Loading от Стивена Клири
vb_subрешил попробовать асинхронно загрузить данные
Один в один мой топик.
...
Рейтинг: 0 / 0
20.09.2017, 14:31
    #39523740
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Async Loading от Стивена Клири
vb_subВ итоге при загрузке все равно визуальный интерфейс фризится. Когда ставлю брекпоинт на return ListItemtemp, отладчик показывает, что выполнение происходит в основном потоке , хотя в примере из статьи- во второстепенном. У кого-то работал аналогичный подход корректно?А что, если вставить строку:
Код: c#
1.
2.
// Искусственная задержка, чтобы показать отзывчивость
    await Task.Delay(TimeSpan.FromSeconds(3)).ConfigureAwait(false);

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

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

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

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

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


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