powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Async Loading от Стивена Клири
111 сообщений из 111, показаны все 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
Async Loading от Стивена Клири
    #39523863
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>vb_sub, вчера, 21:32 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1271937&msg=20807374][20807374]
>...решил попробовать асинхронно загрузить данные...

Так работает:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//-- SELECT из таблицы tbl_Государства
//====================================================================================
private void dow_Государства_Sel() {
  . . .
}

private async void ЗапросДанных() {
  . . .
  await Task.Run(new Action(dow_Государства_Sel));
  . . . 
}
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523888
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,
Т.е. не декларативно готовыми интерфейсами и в xaml, а руками плодя потоки?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39523898
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subесть олдскульная тема с с Dispatcher.BeginInvoke и тд, чтобы избежать фриза интерфейса, но хз кто ей сейчас пользуется.
Одним из сдерживающим моментом является то, что длительная операция запускается из конструктора ViewModel, соответственно асинхронность на высшем уровне использовать нельзя- нужно переписывать на асинхронный конструктор.
Еще неопределенности добавляет неизвестность того, что фризит объект - сама длительная операция или рендеринг GUI- нужно лезть через Perforator, но это опять не получится потому что не успею сразу запустить и Perforator и рабочий процесс, соответственно нужно загрузку переносить на какую-то кнопку. В общем чтобы проверить нужно норм так всего переписать и не факт, что узнаешь истину. Обидно, что чел так накалывает с асинхронностью.Так ты добился, что бы метод initialitemlist выполнялся не в основном потоке?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524093
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Roman MejtesТо есть, в рамках 1 потока, 2 асинхронные задачи будут работать не одновременно, а чередуясь друг с другом.
Очень прикольно.
Пример есть? Асинхронного вызова метода без потока?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
async void Button1_Click(object sender, EventArgs e)
{
    // тут UI поток.
    MessageBox.Show("1");

    await Task.Delay(TimeSpan.FromSeconds(3));

    // и тут UI поток тоже
    MessageBox.Show("2");
}
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524100
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
refreg,
нет, это что я планирую попробовать, когда время появится.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524101
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
при количестве записей около 700 фризится на 2 секунды около.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524120
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

когда Вы вызываете Async void, то операция может выполниться и во второстепенном потоке. Но здесь проблема в том, что метод должен вызываться из конструктора класса+должно присваиваться значение свойству модели, прибинденной к Xaml, на мой взгляд это это вносит свои коррективы, которые и фризят UI.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524146
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subPetro123,
при количестве записей около 700 фризится на 2 секунды около.почему не использовать слово Тормозит).
Две сек. это терпимо и можно забить если не растет с колич.записей.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524174
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
думаю тормозит здесь не совсем уместно, потому что все действия выполняются, только интерфейс недоступен, тем более торможение это замедление в какой-либо степени, здесь отсутствие отзывчивости интерфейса.
С увеличением кол-во записей задержка растет линейно.
Хочется писать в 2к17 году без багов из прошлого.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524182
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КPetro123пропущено...

Очень прикольно.
Пример есть? Асинхронного вызова метода без потока?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
async void Button1_Click(object sender, EventArgs e)
{
    // тут UI поток.
    MessageBox.Show("1");

    await Task.Delay(TimeSpan.FromSeconds(3));

    // и тут UI поток тоже
    MessageBox.Show("2");
}


А асинронность?
Два сообщения друг за другом с задержкой.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524186
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subвсе действия выполняются, только интерфейс недоступен,
Это как?
Т.е. ты можешь чай пить, а ГУИ недоступно?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524187
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subХочется писать в 2к17 году без багов из прошлого.
Я как то думал что биндинг асинхронной коллекции уже есть платформе как у телерика.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524188
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей Кпропущено...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
async void Button1_Click(object sender, EventArgs e)
{
    // тут UI поток.
    MessageBox.Show("1");

    await Task.Delay(TimeSpan.FromSeconds(3));

    // и тут UI поток тоже
    MessageBox.Show("2");
}


А асинронность?
Два сообщения друг за другом с задержкой.Между сообщениями интерактивность UI не блокируется, значит асинхронно. Сравни с синхронным "неправильным" вариантом.
Код: c#
1.
2.
3.
4.
5.
6.
void Button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("1");
    Thread.Sleep(3000);
    MessageBox.Show("2");
}
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524189
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
Ты не ответил что будет на 100 кило записей.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524190
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
Можешь из жизни пример куда это впендюрить. Это же таймер).
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524192
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
могу даже водки выпить, все равно он останется недоступен.
При 100к записей GUI зафризится думаю на минуту или более.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524195
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей К,
Можешь из жизни пример куда это впендюрить. Это же таймер).
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
async void Button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("Пошёл запрос...");

    var data = await DbRepository.ReadDataFromDatabaseAsync();    

    MessageBox.Show("Пришло: " + data.SomeValue);
}
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524198
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
Ок. Как противопол-ть sleep это интересно.
Правда не могу придумать применение.
Проехали.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524200
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subПри 100к записей GUI зафризится думаю на минуту или более.Можно использовать виртуализацию записей. Тогда "тормоза" будут зависеть от количества элементов на экране, а не от общего числа записей.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524201
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей К,
Ок. Как противопол-ть sleep это интересно.
Правда не могу придумать применение.
Проехали.Ok
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524202
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subPetro123,
могу даже водки выпить, все равно он останется недоступен.
При 100к записей GUI зафризится думаю на минуту или более.
Это и есть тормозит. Но как хочешь.
Значит тема моя, что я начинал.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524205
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КPetro123Алексей К,
Можешь из жизни пример куда это впендюрить. Это же таймер).
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
async void Button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("Пошёл запрос...");

    var data = await DbRepository.ReadDataFromDatabaseAsync();    

    MessageBox.Show("Пришло: " + data.SomeValue);
}


Классно. В java такого нет. Руками чере поток делал.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524206
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кvb_subПри 100к записей GUI зафризится думаю на минуту или более.Можно использовать виртуализацию записей. Тогда "тормоза" будут зависеть от количества элементов на экране, а не от общего числа записей.
Вот это мы и ищем. Как будто никто не пишет больших таблиц)
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524210
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей Кпропущено...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
async void Button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("Пошёл запрос...");

    var data = await DbRepository.ReadDataFromDatabaseAsync();    

    MessageBox.Show("Пришло: " + data.SomeValue);
}



Классно. В java такого нет. Руками чере поток делал.
А поток тут точно не создаётся? Надо будет проверить.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524213
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Вот это мы и ищем.А чё её искать, вот она. :-)

Ну или тупо включить DataGrid.EnableRowVirtualization , если не нужна ленивая закачка данных с сервера.

Ну и с этим можно ознакомиться, лишним не будет: Optimizing Performance: Controls

Petro123Как будто никто не пишет больших таблиц)"Большие таблицы на клиенте - зло" (ц) народное :-)
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524218
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Petro123пропущено...

Классно. В java такого нет. Руками чере поток делал.
А поток тут точно не создаётся? Надо будет проверить.Всё зависит от внутренностей ReadDataFromDatabaseAsync. Обычно это работает через порты завершения ввода/вывода. А всё содержимое метода Button1_Click в данном примере работает в UI потоке.

Грубо говоря, в момент завершения "таска" выполняется Dispatcher.BeginInvoke, в котором выполняется код, расположенный после await.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524233
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К
Код: c#
1.
await DbRepository.ReadData


Погоди.
Внутри же поток?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524235
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КОбычно это работает через порты з
Мы не про веб говорим.
Значит твой второй пример не годен.
Без потока только sleep и можно создать.
Как игрушку.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524237
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей К
Код: c#
1.
await DbRepository.ReadData


Погоди.
Внутри же поток?Ну там может быть что угодно, обычно там выполнение через порт завершения ввода/вывода , тот же пул потоков по сути.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524240
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей КОбычно это работает через порты з
Мы не про веб говорим.А какая разница, веб или не веб. Асинхронный ввод/вывод никто не запрещает использовать и в WPF приложениях.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524242
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
А я о том что без потоков асинхронности нету выше и сказал.
Task.Delay это игрушка
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524246
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей К,
А я о том что без потоков асинхронности нету выше и сказал.
Task.Delay это игрушкаНу если в продолжение этой темы, то опять не соглашусь. Ну вот пример без таймера. Продолжение инициируется действиями пользователя.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
TaskCompletionSource<object> TaskSource = new TaskCompletionSource<object>();

async void Button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("1");
    await TaskSource.Task;
    MessageBox.Show("2");
}

void Button2_Click(object sender, EventArgs e)
{
    TaskSource.SetResult(null);
}
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524249
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
Я написал твой тест в проекте.
Твой await требует метод с возвратом Task
Т.е. вернулись к моему коду выше.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524255
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей К,
Я написал твой тест в проекте.
Твой await требует метод с возвратом Task
Т.е. вернулись к моему коду выше.Думаю, что TaskCompletionSource не создаёт потоков.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524260
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНу вот пример без таймера
Поставь ТЯЖЁлый метод for с вычислениями.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524264
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КPetro123Алексей К,
Я написал твой тест в проекте.
Твой await требует метод с возвратом Task
Т.е. вернулись к моему коду выше.Думаю, что TaskCompletionSource не создаёт потоков.
Т.к. это GOTO ))))
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524275
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей КНу вот пример без таймера
Поставь ТЯЖЁлый метод for с вычислениями.Это да, это обычно запускается через "тхридпул".

Но я привёл пример асинхронности без многопоточности, когда продолжение выполнения асинхронной операции инициируется действиями пользователя, всё работает в UI потоке через очередь сообщений.

Вон, в JavaScript многопоточности нет, а асинхронность есть, аж бесит иногда. :-)

Petro123Алексей Кпропущено...
Думаю, что TaskCompletionSource не создаёт потоков.
Т.к. это GOTO ))))Ну можно и так сказать. :-)
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524305
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВон, в JavaScript многопоточности нет, а асинхронность есть, аж бесит иногда. :-)
Да.
Тем более я с Java и мне странно всё это))).
Аффтар пусть пробует твои ссылки. Я попозже обязательно. Текучка.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524338
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, что про RX никто не вспомнил.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524343
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>vb_sub, сегодня, 10:28 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1271937&msg=20811142] [20811142]
>...думаю тормозит здесь не совсем уместно...
Посмотри здесь
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524357
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныСтранно, что про RX никто не вспомнил.Время похоронило этот проект. :-)
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524371
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевдумаю тормозит здесь не совсем уместно...
Ну, если по ссылке ограничение ресурсов проца для тебя не тормоза, тогда конечно.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524515
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>vb_sub, сегодня, 10:28 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1271937&msg=20811142] [20811142]
>...думаю тормозит здесь не совсем уместно...
Посмотри здесь Трудности перевода:


Оригинал:
async methods need to have an await keyword in their body or they will never yield!
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524605
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока нашел такой вариант, в принципе устраивает.

Код: 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.
private void initialflightlist()
        {
           items = new ObservableCollection<item>();

            var bk = new BackgroundWorker();
            bk.DoWork += async (s, e) =>
            {
                string connectionString = "##";
                using (OracleConnection connection = new OracleConnection())
                {
                    try
                    {
                        connection.ConnectionString = connectionString;
                        using (OracleCommand command = connection.CreateCommand())
                        {
                            string sql = $"sql";

                            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))
                                {
                                    Application.Current.Dispatcher.Invoke(DispatcherPriority.Render, (Action)(() =>
                                     {
                                         items.Add(new item
                                         {
                                             item1 = Convert.ToString(reader["fld1"]),
                                             item2 = Convert.ToDateTime(reader["fld2"])
                                         });
                                     }));
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        //MessageBox.Show(ex.Message);
                    }
                    finally
                    {
                        if (connection.State == ConnectionState.Open)
                            connection.Close();
                    }
                }
            };
            bk.RunWorkerAsync();
            OnPropertyChanged("items");
			}
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524611
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub,
А зачем 3 раза await, когда можно один раз на весь код сразу.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524612
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И как себя ведёт ГУИ.
Сразу показ первых записей и потом докачка остальных или что?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524614
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123vb_sub,
А зачем 3 раза await, когда можно один раз на весь код сразу.Чтобы поток не висел в ожидании ввода/вывода на всех этапах запроса, с этим всё в порядке.

Тут непонятно накой использовать BackgroundWorker и Dispatcher.Invoke ( тут лучше BeginInvoke ), когда лучше научиться пользоваться "тасками" и async|await.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524634
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
здесь есть 2 стратегии
1) одним махом присваиваем все элементы коллекции свойству ViewModel.
Код: c#
1.
items=tempitems;


Этот вариант для меня нежелателен, потому что на мой взгляд больше просаживает GUI
2)добавление по одному элементу, как в примере - более желательный вариант, потому что визуально не видно заморозки GUI

Каждый элемент прорисовывается при добавлении. Можешь заценить как визуально выглядит по этой ссылке

https://stackoverflow.com/questions/44302328/how-to-properly-improve-itemscontrol-loading-and-avoid-freezing
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524637
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

потому что не получилось достичь аналогичного эффекта с помощью тасков.
В диспетчере на мой взгляд решает DispatcherPriority.Render - ставим приоритет для прорисовки.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524639
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subКаждый элемент прорисовывается при добавлении.При включенной виртуализации записей каждый элемент не прорисовывается.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524641
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subпотому что не получилось достичь аналогичного эффекта с помощью тасков.Ну я и предложил разобраться с тем, что не получилось.
vb_subВ диспетчере на мой взгляд решает DispatcherPriority.Render - ставим приоритет для прорисовки.Нет, это не то.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524644
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
Он до сих пор не вкл. Виртуализацию?
Тогда это велосипед.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524646
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
пробовал в таски оборачивать различными способами- и через Async и через Task.Run- никак не получалось.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524664
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subАлексей К,
пробовал в таски оборачивать различными способами- и через Async и через Task.Run- никак не получалось.
Он давал ссылку DataGrid.EnableRowVirtualization
Т.е. закачка будет только того что на экране. Т.е. 0,1 сек.
?
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524683
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subАлексей К,
пробовал в таски оборачивать различными способами- и через Async и через Task.Run- никак не получалось.
Так попробуй:
Код: 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.
void initialflightlist()
{
    items = new ObservableCollection<item>();
    OnPropertyChanged("items");

    string connectionString = "##";

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

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

                command.CommandText = sql;

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

                DbDataReader reader = await command.ExecuteReaderAsync();
                if (reader.HasRows)
                {
                    while (await reader.ReadAsync())
                    {
                        // Тут я бы добавлял в забинденный к UI список не по одной записи, а пачками по N записей.
                        items.Add(new item
                        {
                            item1 = Convert.ToString(reader["fld1"]),
                            item2 = Convert.ToDateTime(reader["fld2"])
                        });
                    }
                }
            }
        }
        catch (Exception ex)
        {
            //MessageBox.Show(ex.Message);
        }
        finally
        {
            if (connection.State == ConnectionState.Open)
                connection.Close();
        }
    }    
}
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524708
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
Зачем finally если using.
Зачем catch.
А то как то полезного кода 3 строки из простыни кода.
Это наверно потому что без EF.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524711
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

BeginInvoke это асинхронный возыв. Если к примеру в цикле вызвать 100500 раз этот метод, то они отработают все когда очередь Dispatcher'а для заданного приоритета освободится, далеко не всегда такое поведение.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524721
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей К,
Зачем finally если using.
Зачем catch.
А то как то полезного кода 3 строки из простыни кода.
Это наверно потому что без EF.Ну я не стал упрощать, просто переделал на "обычный" async что есть.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524725
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesАлексей К,

BeginInvoke это асинхронный возыв. Если к примеру в цикле вызвать 100500 раз этот метод, то они отработают все когда очередь Dispatcher'а для заданного приоритета освободится, далеко не всегда такое поведение.Ну сдаётся мне, что модель не должна ждать отрисовки UI. А если UI не успевает обрабатывать отправляемые ему сообщения, то нужно менять концепцию.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524769
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КRoman MejtesАлексей К,

BeginInvoke это асинхронный возыв. Если к примеру в цикле вызвать 100500 раз этот метод, то они отработают все когда очередь Dispatcher'а для заданного приоритета освободится, далеко не всегда такое поведение.Ну сдаётся мне, что модель не должна ждать отрисовки UI. А если UI не успевает обрабатывать отправляемые ему сообщения, то нужно менять концепцию.
сценарии могут быть разные.
Если ждать, как раз если ждать отрисовки UI не нужно, то BeginInvoke не особо то и нужно. Как в прочем и использовать Dispatcher.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524801
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отрисовка UI должна быть в объекте таблица.
А то биндинга прогресс дошёл, а paint руками делать.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39524802
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesBeginInvoke не особо то и нужно. Как в прочем и использовать Dispatcher.
+1
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525115
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>vb_sub, сегодня, 08:39 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1271937&msg=20814371] [20814371]
Пока нашел такой вариант, в принципе устраивает.
А если так:
1. В DoWork
-a) не использовать async/await.
-b) item записывать в потокобезопасное FIFO
2. Задействовать ProgressChanged, где и переписывать item в items
3. В RunWorkerCompleted дополнительно проверить FIFO на пустоту
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525124
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеевне использовать async/await.
Любите вы извращения))).
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525200
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesАлексей Кпропущено...
Ну сдаётся мне, что модель не должна ждать отрисовки UI. А если UI не успевает обрабатывать отправляемые ему сообщения, то нужно менять концепцию.
сценарии могут быть разные.А люди все одинаковые. Обычному человеку не нужно обновление UI 1000 раз в секунду.
Roman MejtesЕсли ждать, как раз если ждать отрисовки UI не нужно, то BeginInvoke не особо то и нужно. Как в прочем и использовать Dispatcher.Я ничего не понял. Invoke - отправка сообщения в очередь с ожиданием обработки сообщения очередью. BeginInvoke - отправка в очередь без ожидания. Модель в нормальной ситуации оповещает UI и ничего не ждёт, работает дальше, поэтому нужность Invoke, на мой взгляд, сомнительна.

Контекст синхронизации в своих глубинах использует Dispatcher.BeginInvoke, поэтому фраза " то BeginInvoke не особо то и нужно. Как в прочем и использовать Dispatcher " у меня вызывает некоторое удивление.

Мне кажется, что ты немного запутался.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525224
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то у меня не разложилось в голове по полочкам).
Писать ведь можно по разному.
Если мы по MVVM, то например в андроиде это:
Код: c#
1.
UserViewModel extends BaseObservable // ViewModel с БЛ


т.е. не хочется в слое бизнес логики заниматься какими то invoke и сообщениями. Техническими вещами.
Далее биндинг:
Код: c#
1.
2.
3.
4.
5.
6.
        setContentView(R.layout.activity_main);
        //binding+ ActivityMainBinding - generate from R.layout.activity_main
        final ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        UserViewModel userViewModel = new UserViewModel("TestBinding");
        binding.setUserViewModel(userViewModel);
        //binding-


Я так понял, что у ТС - MVP
И собственно всё. Больше кода то нету.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525238
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КPetro123Вот это мы и ищем.А чё её искать, вот она. :-)
написано что в C# виртуализация не поддерживается и показан велосипед самописка
Алексей КНу или тупо включить DataGrid.EnableRowVirtualization , если не нужна ленивая закачка данных с сервера.
не понял отличия этого метода и приведённого кода вами и ТС.
Если просто галку включить тормозить вед не будет?
Алексей К"Большие таблицы на клиенте - зло" (ц) народное :-)
это для веб справедливо (на данном этапе технологий).
Для десктопа размер тысяч данных не должно быть проблемой (девэкспресс).
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525240
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
Отсюда вопрос прежний. Все в десктопе пишут самописки как на хабре или ставят галку по вашей ссылке?
Или у всех телерик с интерфейсом VirtualQueryableCollectionView<T>
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525244
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КА люди все одинаковые. Обычному человеку не нужно обновление UI 1000 раз в секунду.
IMHO по простому логика сообщений должна быть такая:
- основной поток загружает табличку и дал команду на загрузку коллекции
- на OnShow показал что успело загрузиться БЕЗ ТОРМОЗОВ
- в доп потоке продолжает грузится но основной поток не трогается
- только при скроллинге берётся новая порция самим гридом, а не коллекция пихает в грид порции.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525294
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей К,
Отсюда вопрос прежний. Все в десктопе пишут самописки как на хабре или ставят галку по вашей ссылке?
Или у всех телерик с интерфейсом VirtualQueryableCollectionView<T>Мы похоже говорим немного о разных вещах.

1. Ленивая загрузка данных с сервера - отсутствует, кому надо, те пишут велосипеды "как на хабре". Это то, чего ты хочешь, как я понял.

2. Виртуализация записей WPF - в большинстве контролов по умолчанию включена, в этом режиме создаются контейнеры только для отображаемых записей. Я упомянул об этом из-за того, что выше говорилось о тормозах WPF при большом количестве записей, что на самом деле не так. Тормоза, видимо, связаны просто с загрузкой большого объёма данных в модель, WPF тут тормозов не добавляет.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525297
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей КА люди все одинаковые. Обычному человеку не нужно обновление UI 1000 раз в секунду.
IMHO по простому логика сообщений должна быть такая:
- основной поток загружает табличку и дал команду на загрузку коллекции
- на OnShow показал что успело загрузиться БЕЗ ТОРМОЗОВ
- в доп потоке продолжает грузится но основной поток не трогается
- только при скроллинге берётся новая порция самим гридом, а не коллекция пихает в грид порции.И так можно. Думаю, что здесь разные способы имеют право на жизнь. :-)
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525306
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КPetro123Алексей К,
Отсюда вопрос прежний. Все в десктопе пишут самописки как на хабре или ставят галку по вашей ссылке?
Или у всех телерик с интерфейсом VirtualQueryableCollectionView<T>Мы похоже говорим немного о разных вещах.

1. Ленивая загрузка данных с сервера - отсутствует, кому надо, те пишут велосипеды "как на хабре". Это то, чего ты хочешь, как я понял.

2. Виртуализация записей WPF - в большинстве контролов по умолчанию включена, в этом режиме создаются контейнеры только для отображаемых записей. Я упомянул об этом из-за того, что выше говорилось о тормозах WPF при большом количестве записей, что на самом деле не так. Тормоза, видимо, связаны просто с загрузкой большого объёма данных в модель, WPF тут тормозов не добавляет.
Я автор ищем способы чтобы табла в ГУИ не тормозила.
Правда он называет это словом заморозка, а слово ленивая я от тебя здесь первый раз услышал.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525307
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КТормоза, видимо, связаны просто с загрузкой большого объёма данных в модель, WPF тут тормозов не добавляет.
Вот и пойми вас.
Конечно, тормоза связаны с загрузкой в модель, т.к. тянуть на клиента сразу всю таблу накладно.
Ну, давай не про WPF, а целиком про платформу. Т.к. большие таблицы везде есть.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525308
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИ так можно. Думаю, что здесь разные способы имеют право на жизнь. :-)
OK
Ищем Минимальный код для Больших таблиц чтобы не тормозило.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525309
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кразные способы
почитал в сети.
Немного другой код получается при редактировании коллекции с клиента на сервер при больших списках.
Будет ошибка кода доступа к объекту из потока где он не был создан.
Получается, что если только читаем, то код там должен быть простой как 5 копеек.
Если с редактированием, то нужно перебрасывать из потокового списка коллекции в коллекцию биндинга в потоке ГУИ.
Получается 2 варианта кода imho.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525395
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей КИ так можно. Думаю, что здесь разные способы имеют право на жизнь. :-)
OK
Ищем Минимальный код для Больших таблиц чтобы не тормозило.Мне видится развитие концепции, предложенной ТС.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create table Test
(
    ID int not null primary key,
    Caption varchar(500) not null
)

declare @i int
set @i = 0

set nocount on

while @i < 1000000 begin
    set @i = @i + 1
    insert into Test (ID, Caption) values (@i, '--------------------- Value: ' + cast(@i as varchar) + ' ---------------------------')
end

set nocount off

-- drop table Test


Код: 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.
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BackgroundFetch.Properties;

namespace BackgroundFetch
{
    public class DataItem
    {
        public int ID { get; set; }

        public string Caption { get; set; }
    }

    public class DataService
    {
        public async Task LoadData(Action<IEnumerable<DataItem>> appendResult)
        {
            using (var cn = new SqlConnection(Settings.Default.AppDb))
            {
                await cn.OpenAsync();

                using (var cmd = cn.CreateCommand())
                {
                    cmd.CommandTimeout = 300;
                    cmd.CommandText = "select * from Test";

                    using (var rdr = await cmd.ExecuteReaderAsync())
                    {
                        var result = new List<DataItem>();

                        while (await rdr.ReadAsync())
                        {
                            result.Add(new DataItem
                            {
                                ID = Convert.ToInt32(rdr["ID"]),
                                Caption = Convert.ToString(rdr["Caption"])
                            });

                            if (result.Count == 1000)
                            {
                                appendResult(result);
                                result.Clear();
                            }
                        }

                        if (result.Count > 0)
                            appendResult(result);
                    }
                }
            }
        }
    }
}


Код: 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.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace BackgroundFetch
{
    public partial class MainWindow : Window
    {
        ObservableCollection<DataItem> Items = new ObservableCollection<DataItem>();

        public MainWindow()
        {
            InitializeComponent();
            dataGrid.ItemsSource = Items;
        }

        async void Window_Loaded(object sender, RoutedEventArgs e)
        {
            var svc = new DataService();

            await svc.LoadData(items =>
            {
                foreach (var item in items)
                    Items.Add(item);
            });
        }
    }
}


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<Window x:Class="BackgroundFetch.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid>
        <DataGrid Margin="10" Name="dataGrid"/>
    </Grid>
</Window>


Записи постепенно добавляются в конец, просмотру таблицы это вроде не мешает.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525427
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КPetro123OK
Ищем Минимальный код для Больших таблиц чтобы не тормозило.Мне видится развитие концепции, предложенной ТС.
по моему - идеально. Ни убрать, ни добавить.
И страшных слов invoke вроде бы нету).
Спс. за один из методов решения сабжа.
ЗЫ Обилие слов await (старт потока) тут явно из за БД сиквела и дров от этой БД (cmd.ExecuteReaderAsync).
У меня в проекте PosgreSQL (нету XXXXAsync), поэтому вероятно будет 1 поток и одно слово await.
20809489
Ну, и интересен пример с EF. Это ведь прогрессивно).
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525462
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Ну, и интересен пример с EF. Это ведь прогрессивно).
Интересно, как EF справится с PG. Иначе прогрессивность сама себя вывернет наружу (хотя ей не привыкать).
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525467
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныPetro123Ну, и интересен пример с EF. Это ведь прогрессивно).
Интересно, как EF справится с PG. Иначе прогрессивность сама себя вывернет наружу (хотя ей не привыкать).Думаю, что справится. При первой возможности попробую набросать пример.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525468
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей Кпропущено...
Мне видится развитие концепции, предложенной ТС.
по моему - идеально. Ни убрать, ни добавить.
И страшных слов invoke вроде бы нету).
Спс. за один из методов решения сабжа.
ЗЫ Обилие слов await (старт потока) тут явно из за БД сиквела и дров от этой БД (cmd.ExecuteReaderAsync).
У меня в проекте PosgreSQL (нету XXXXAsync), поэтому вероятно будет 1 поток и одно слово await.
20809489
Ну, и интересен пример с EF. Это ведь прогрессивно).Продолжение, следующее за await, по дефолту выполняется через контекст синхронизации, в глубинах которого живёт Dispatcher.BeginInvoke (аналог PostMessage из winapi). Если контекст синхронизации отсутствует или отключен через .ConfigureAwait(false), то продолжение выполняется через пул потоков.

Базовые СУБД-независимые классы DbCommand и т. п. имеют асинхронные методы, вроде как все современные провайдеры СУБД это так же должны поддерживать. Уточни версию .Net Framework, должен быть 4.5+.

Ну и пример под EF сделаю при первой возможности, самому интересно стало. :-)
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525492
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КБазовые СУБД-независимые классы DbCommand и т. п. имеют асинхронные методы,
тут такая штука:
У меня в своём проекте есть асинхронность не для таблицы, а для добавления слоёв из базы в ГИС карту.
И на строке Task.Run
{
}
создаётся поток в цикле.
Т.е. если поток создаётся, то нафига мне плодить ещё поток на коннект, на command и на реадер?
Код: c#
1.
2.
3.
4.
5.
6.
Task.Run
{
  await XXXX.коннектAsync
  await XXXX.commandAsync
  for (XXXX.readerAsync
}


Масло масляное или оверхед, я так понимаю.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525494
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныИнтересно, как EF справится с PG
Если PG это Postgre, то ниже описал, что сейчас всё работает если брать непотоковый код к базе и запускать его в потоке.
Не уточнял, потокозащищённый ли сам драйвер к базе.
Пока все ошибки что есть ловятся выше драйвера.
Например, общая коллекция Dictionary меняю на ConcurrentКоллекцию и т.д.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525540
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныPetro123Ну, и интересен пример с EF. Это ведь прогрессивно).
Интересно, как EF справится с PG. Иначе прогрессивность сама себя вывернет наружу (хотя ей не привыкать).Сразу неправильно понял, что такое PG. :-)

EF с PosgreSQL справляется нормально.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525543
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123, версия с EF.
Код: 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.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using BackgroundFetch.Properties;

namespace BackgroundFetch
{
    [Table("Test", Schema = "dbo")]
    public class DataItem
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int ID { get; set; }

        [Required]
        [MaxLength(500)]
        public string Caption { get; set; }
    }

    public class AppDbContext : DbContext
    {
        static AppDbContext()
        {
            Database.SetInitializer<AppDbContext>(null);
        }

        public AppDbContext()
            : base(Settings.Default.AppDb)
        { }

        public IDbSet<DataItem> DataItem
        {
            get { return Set<DataItem>(); }
        }
    }

    public class DataService
    {
        public async Task LoadData(Action<IEnumerable<DataItem>> appendResult)
        {
            using (var db = new AppDbContext())
            {
                var q = db.DataItem.Where(v => v.ID > 10); // <---- Хоть какой-нибудь LINQ запрос.

                using (var e = ((IDbAsyncEnumerable<DataItem>)q).GetAsyncEnumerator())
                {
                    var result = new List<DataItem>();

                    while (await e.MoveNextAsync(CancellationToken.None))
                    {
                        result.Add(e.Current);

                        if (result.Count == 1000)
                        {
                            appendResult(result);
                            result.Clear();
                        }
                    }

                    if (result.Count > 0)
                        appendResult(result);
                }
            }
        }
    }
}

...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525547
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Алексей КБазовые СУБД-независимые классы DbCommand и т. п. имеют асинхронные методы,
тут такая штука:
У меня в своём проекте есть асинхронность не для таблицы, а для добавления слоёв из базы в ГИС карту.
И на строке Task.Run
{
}
создаётся поток в цикле.
Т.е. если поток создаётся, то нафига мне плодить ещё поток на коннект, на command и на реадер?
Код: c#
1.
2.
3.
4.
5.
6.
Task.Run
{
  await XXXX.коннектAsync
  await XXXX.commandAsync
  for (XXXX.readerAsync
}


Масло масляное или оверхед, я так понимаю.При таком использовании Task.Run начало и все продолжения, в том числе в вызываемых методах, выполняются через пул потоков, независимо от наличия контекста синхронизации. Иногда это бывает полезно.
...
Рейтинг: 0 / 0
Async Loading от Стивена Клири
    #39525550
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КTask.Runда.
Думаю, при таком методе берём обычный синхронный код и вставляем не плодя await.
Конечно, смотрим чтобы он был потокобезопасный.
...
Рейтинг: 0 / 0
111 сообщений из 111, показаны все 5 страниц
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Async Loading от Стивена Клири
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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