Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 437
1

Асинхронные операции

25.03.2018, 19:49. Просмотров 1040. Ответов 3
Метки нет (Все метки)


Есть у меня источник с элементами (ObservableCollection), и специальные коллекции "отображения", тоже типа ObservableCollection. Коллекции отображения привязываются к листбоксам, но нужны они для реализации функции поиска, т.е. идет проход по источнику и добавление в коллекцию "отображения" элементов удовлетворяющих предикату. Поиск может быть долгим, и я решил сделать его асинхронным, но изменение коллекции возможно лишь из потока DispatcherObject, поэтому сначала я вызываю предикат для каждого элемента из источника и записываю результат в BitArray, а затем уже в потоке DispatcherObject добавляю в коллекцию отображения соответствующие элементы. А теперь основной вопрос - я не понимаю как происходит этот завхват контекса, ну т.е. как после выполнения await, снова происходит выполнение в потоке DispatcherObject? И получается, что если несколько асинхронных вызовов, то что ли в одном и том же потоке (DispatcherObjectа) выполняется несколько операций параллельно?
Вот код, если кому интересно:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private async Task Filter(object o = null)
        {
            BitArray filterMap = null;
            await Task.Factory.StartNew(() =>
            {
                lock (_source)
                    if (SearchString == "")
                    {
                        _isItemsFiltered = false;
                        SyncWithSource();
                        return;
                    }
                _isItemsFiltered = true;
                filterMap = new BitArray(Count);
                for (int i = 0; i < Count; i++)
                    filterMap[i] = _filter(_source[i], _searchString);
            });
            Clear();
            for (int i = 0; i < filterMap.Count; i++)
                if(filterMap[i])
                    InternalAdd(_source[i]);
        }


Добавлено через 8 часов 35 минут
Да, скорее всего параллельно.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2018, 19:49
Ответы с готовыми решениями:

Асинхронные операции
Console.WriteLine(&quot;Some code&quot;); using (var fs = new System.IO.FileStream(&quot;File.txt&quot;,...

Асинхронные операции на C#
Реализую обмен данными с устройством по USB-каналу (bulk передача) с использованием функций WinUSB...

асинхронные делегаты
Добрый день. Вопрос мой об ассинронных делегатах. Я не могу никак понять EndInvoke() дожидается...

Асинхронные сокеты
Здравствуйте. Очень нужна ваша помощь. Вот callback функция которая передается в метод асинхронного...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
3
Эксперт .NET
14852 / 11239 / 2949
Регистрация: 17.09.2011
Сообщений: 18,825
26.03.2018, 09:01 2
Лучший ответ Сообщение было отмечено RaevskiAnatoly как решение

Решение

Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Есть у меня источник с элементами (ObservableCollection), и специальные коллекции "отображения", тоже типа ObservableCollection.
А зачем такой велосипед?
Есть же готовые механизмы в виде CollectionView.

Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
изменение коллекции возможно лишь из потока DispatcherObject
Не обязательно.
Если не ошибаюсь, то с версии 4.5 можно изменять привязанные коллекции из дочерних потоков с использованием синхронизации.

Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
я не понимаю как происходит этот завхват контекса, ну т.е. как после выполнения await, снова происходит выполнение в потоке DispatcherObject?
Автоматически.
Точка await преобразуется в return с подпиской продолжения метода в виде делегата и с захватом текущего контекста синхронизации, в котором будет продолжено выполнение по окончании асинхронной операции.
При асинхронном вызове можно указать, что продолжение выполнения может выполняться в том контексте, в котором завершилась асинхронная операция:
C#
1
await DoSomethingAsync().ConfigureAwait(false);
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
И получается, что если несколько асинхронных вызовов, то что ли в одном и том же потоке (DispatcherObjectа) выполняется несколько операций параллельно?
Асинхронно, а не параллельно — это разные вещи.
Но да, в одном и том же потоке может выполняться несколько задач "одновременно" — это и есть асинхронность.

Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Вот код, если кому интересно
await + lock = верный способ наглухо повесить приложение.
Будьте с ними очень осторожны.
1
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 437
26.03.2018, 16:59  [ТС] 3
Так меня и интересовало как это один поток UI вдруг может взять и одновременно что-то делать. Просто приостанавливаются одни задачи, и начинают выполняться другие, и так по очереди. Вот здесь про модели выполнения.

Добавлено через 10 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
А зачем такой велосипед?
Если не знаешь где купить, то приходится делать самому.

Добавлено через 15 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Есть же готовые механизмы в виде CollectionView.
А вот в случае изменения коллекции-источника, как наиболее оптимально отразить это в представление? Написано, что Refresh пересоздает представление, то есть полностью пересканирует источник, можно как-нибудь быстрее сдеалть обновление?

Добавлено через 47 минут
Вроде вопрос снят. По результатам тестов, если изменяется ObservableCollection, что является источником элементов для CollectionViewSource, то CollectionViewSource обновляется сама.
0
Эксперт .NET
14852 / 11239 / 2949
Регистрация: 17.09.2011
Сообщений: 18,825
26.03.2018, 18:17 4
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Так меня и интересовало как это один поток UI вдруг может взять и одновременно что-то делать.
Вы это наблюдаете каждый день, работая в среде Windows и создавая приложения на Windows Forms или WPF: в обеих системах один поток для отрисовки интерфейса, однако мышка ездит, прогресс бары двигаются, кнопочки нажимаются и тд. — все вроде как одновременно, а на деле в одном потоке. Классический пример асинхронности.

Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Просто приостанавливаются одни задачи, и начинают выполняться другие, и так по очереди.
Да, задачи разбиваются на куски и выполняются кусками.
В статье, в принципе, все верно описано.

Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
А вот в случае изменения коллекции-источника, как наиболее оптимально отразить это в представление?
Начиная с версии .NET 4.5 некоторые реализации CollectionView (ListCollectionView, например) поддерживают "живое" автообновление: при создании вы указываете, что нужна сортировка/фильтрация в реальном времени и указываете свойства объектов, которые на это влияют.
Если типы, хранящиеся в коллекции, реализуют INotifyPropertyChanged, то представление подпишется и будет обновлять список автоматически.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2018, 18:17

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Асинхронные методы в стиле Erlang
Уже не в первый раз встречаюсь с задачей и не знаю, как её реализовать согласно задумке. Задача...

Клиент + Сервер, асинхронные сокеты
Привет! Пишу клиент серверное приложение на основе асинхронных сокетов. Цель передача картинки....

Асинхронные сокеты. Работа из нескольких окон
Есть клиент и есть сервер. Написаны по примерам которые можно найти здесь и здесь соответственно....

SDK Яндекс Диск и асинхронные методы
Здравствуйте. Есть метод получения списка файлов в папке в SDK такой как GetListAsync. метод...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.