Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444

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

25.03.2018, 19:49. Показов 1650. Ответов 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)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.03.2018, 19:49
Ответы с готовыми решениями:

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

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

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

3
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.03.2018, 09:01
Лучший ответ Сообщение было отмечено 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
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
26.03.2018, 16:59  [ТС]
Так меня и интересовало как это один поток UI вдруг может взять и одновременно что-то делать. Просто приостанавливаются одни задачи, и начинают выполняться другие, и так по очереди. Вот здесь про модели выполнения.

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

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

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

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

Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
А вот в случае изменения коллекции-источника, как наиболее оптимально отразить это в представление?
Начиная с версии .NET 4.5 некоторые реализации CollectionView (ListCollectionView, например) поддерживают "живое" автообновление: при создании вы указываете, что нужна сортировка/фильтрация в реальном времени и указываете свойства объектов, которые на это влияют.
Если типы, хранящиеся в коллекции, реализуют INotifyPropertyChanged, то представление подпишется и будет обновлять список автоматически.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.03.2018, 18:17
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru