Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
 Async Loading от Стивена Клири  [new]
vb_sub
Member

Откуда:
Сообщений: 776
Всем привет, решил попробовать асинхронно загрузить данные по аналогии с https://msdn.microsoft.com/ru-ru/magazine/dn605875.aspx.
///свойство 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;
            }
        }
        }


 ItemsSource="{Binding itemsList.Result ,IsAsync=True}"


В итоге при загрузке все равно визуальный интерфейс фризится. Когда ставлю брекпоинт на return ListItemtemp
, отладчик показывает, что выполнение происходит в основном потоке, хотя в примере из статьи- во второстепенном. У кого-то работал аналогичный подход корректно?
19 сен 17, 21:32    [20807374]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
vb_sub,
Мне где то говорили что в wpf ленивая загрузка есть из коробки. Тогда не понял ваш сабж.
20 сен 17, 08:13    [20807813]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
vb_sub,
20 сек открывается 60 килозаписей. Есть Lazy из коробки в платформе?
Но я пока приостановил тот сабж. Другие задачи поставили.
20 сен 17, 08:25    [20807822]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
vb_sub
Member

Откуда:
Сообщений: 776
Petro123,
Вы имеете ввиду скорее всего Priority Binding, но это когда нужно показать что-то, пока не загрузится основной Binding.Не знаю фризится при этом интерфейс или нет, но это к сожалению не то, что нужно.
20 сен 17, 08:25    [20807823]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
vb_sub
Member

Откуда:
Сообщений: 776
Petro123,
lazy это когда объект инициализируется при первой потребности в нем- соответственно все равно, когда лист item будет инициализироваться, то он заморозит интерфейс.
20 сен 17, 08:27    [20807829]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
vb_sub,
"Показать что то, пока...", фризится, тормозит - это всё одно и то же. Разве нет?
Ты опиши задачу от пользователя.
20 сен 17, 09:07    [20807870]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
vb_sub
lazy

Да. Вроде решили, что это слово говорит о ленивой загрузке не основной коллекции, а чилдрен подчиненных объектов.
20 сен 17, 09:10    [20807874]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
vb_sub
решил попробовать асинхронно загрузить данные

Один в один мой топик.
20 сен 17, 09:12    [20807877]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
refreg
Member

Откуда: Саратов
Сообщений: 778
vb_sub
В итоге при загрузке все равно визуальный интерфейс фризится. Когда ставлю брекпоинт на return ListItemtemp, отладчик показывает, что выполнение происходит в основном потоке, хотя в примере из статьи- во второстепенном. У кого-то работал аналогичный подход корректно?
А что, если вставить строку:
// Искусственная задержка, чтобы показать отзывчивость
    await Task.Delay(TimeSpan.FromSeconds(3)).ConfigureAwait(false);
Выполнение так и останется в основном потоке?
20 сен 17, 14:31    [20809099]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
Асинхронное выполнение <> многопоточное.
попробуйте просто обернуть в свой Task, можно даже свой планировщик тогда определить
20 сен 17, 15:11    [20809259]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
vb_sub
Member

Откуда:
Сообщений: 776
refreg,
тогда вообще дичь получается- программа падает в бесконечный цикл и будет бесконечно возвращать return через значение временной задержки (данные в UI не передаются). Когда смотрел статус задачи из примера то ее статус RunToCopletion, если же ставлю задержку в свой пример, то там все время статус WaitForActivation-то есть она не успевает запуститься.
20 сен 17, 15:25    [20809313]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2420
>vb_sub, вчера, 21:32 [20807374]
>...решил попробовать асинхронно загрузить данные ...
Посмотри здесь.

С уважением,
Владимир
20 сен 17, 15:41    [20809375]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
refreg
Member

Откуда: Саратов
Сообщений: 778
vb_sub
refreg,
тогда вообще дичь получается- программа падает в бесконечный цикл и будет бесконечно возвращать return через значение временной задержки (данные в UI не передаются). Когда смотрел статус задачи из примера то ее статус RunToCopletion, если же ставлю задержку в свой пример, то там все время статус WaitForActivation-то есть она не успевает запуститься.
Ну попробуй время уменьшить до 1 милисекунды. Но это не решение твоей проблемы. Проблема глубже.

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

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

В данном случае, тебе надо быть уверенным, что метод initialitemlist будет выполняться в отдельном потоке. Поэтому желательно, создать отдельный поток самому.
20 сен 17, 15:59    [20809422]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
refreg
Поэтому желательно, создать отдельный поток самому.

Это будет ещё на пару экранов кода.
20 сен 17, 16:02    [20809432]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Roman Mejtes
Асинхронное выполнение <> многопоточное

Везде где делал await смотрел в отладчике, код выполнялся не в потоке ГУИ.
20 сен 17, 16:04    [20809443]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
refreg
Member

Откуда: Саратов
Сообщений: 778
Petro123
refreg
Поэтому желательно, создать отдельный поток самому.

Это будет ещё на пару экранов кода.
Task.Factory.StartNew
20 сен 17, 16:05    [20809447]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
refreg
Member

Откуда: Саратов
Сообщений: 778
Petro123
Roman Mejtes
Асинхронное выполнение <> многопоточное

Везде где делал await смотрел в отладчике, код выполнялся не в потоке ГУИ.
ТС не обладает таким везением
20 сен 17, 16:08    [20809458]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Я вот смотрю, аффтар хочет не тормозя ГУИ загрузить свою коллекцию items для показа в ГУИ.
Вероятно сейчас загрузка у него секунд 15.
Получается руками надо в wpf писать такую фичу?
20 сен 17, 16:09    [20809459]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
refreg
ТС не обладает таким везением
дай ссылку как и кто определяет в потоке будет код или решит не надо).
20 сен 17, 16:11    [20809470]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
refreg
Task.Factory.StartNew

У меня после wait разумеется метод:
Task myMetod {
Return Task.Run (
..
А как иначе))
20 сен 17, 16:18    [20809489]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
refreg
Когда ты вызываешь асинхронный метод, то нет никакой гарантии, что асинхронный метод создаст задачу на выполнение.

Я так понял, ты про случай когда метод писал не ты сам. Ок.
20 сен 17, 16:25    [20809518]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
refreg
Когда ты вызываешь асинхронный метод, то нет никакой гарантии, что асинхронный метод создаст задачу на выполнение. Метод может выполняться синхронно.

Вызывая Async метод мы в любом случае выполняем таск (задачу),
вопрос лишь в том, в каком потоке эта задача будет выполняться.
асинхронные операции могут выполняться в однопоточном приложении и много поточком. Им нет до этого никакого дела.
Асинхронной операцией называют ту, которая может прервать своё выполнение, а затем продолжить.
То есть, в рамках 1 потока, 2 асинхронные задачи будут работать не одновременно, а чередуясь друг с другом.
20 сен 17, 16:40    [20809567]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4036
и сам по себе Task обеспечивает именно асинхронность, а за многопоточное выполнение тасков отвечает его планировщик. Именно планировщик запускает таски в пуле потоков, сами по себе они в других потоках выполняться не будут.
20 сен 17, 16:42    [20809571]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38640
Roman Mejtes
То есть, в рамках 1 потока, 2 асинхронные задачи будут работать не одновременно, а чередуясь друг с другом.

Очень прикольно.
Пример есть? Асинхронного вызова метода без потока?
20 сен 17, 16:46    [20809579]     Ответить | Цитировать Сообщить модератору
 Re: Async Loading от Стивена Клири  [new]
vb_sub
Member

Откуда:
Сообщений: 776
есть олдскульная тема с с Dispatcher.BeginInvoke и тд, чтобы избежать фриза интерфейса, но хз кто ей сейчас пользуется.
Одним из сдерживающим моментом является то, что длительная операция запускается из конструктора ViewModel, соответственно асинхронность на высшем уровне использовать нельзя- нужно переписывать на асинхронный конструктор.
Еще неопределенности добавляет неизвестность того, что фризит объект- сама длительная операция или рендеринг GUI- нужно лезть через Perforator, но это опять не получится потому что не успею сразу запустить и Perforator и рабочий процесс, соответственно нужно загрузку переносить на какую-то кнопку. В общем чтобы проверить нужно норм так всего переписать и не факт, что узнаешь истину. Обидно, что чел так накалывает с асинхронностью.
20 сен 17, 16:52    [20809599]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5   вперед  Ctrl      все
Все форумы / WPF, Silverlight Ответить