Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
MS SQL

Как из асинхронного метода получить объект?

26.03.2020, 18:37. Показов 5408. Ответов 24
Метки c# (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос
Как из асинхронного метода получить объект?

Используется
- Microsoft.EntityFrameworkCore;
- Microsoft.EntityFrameworkCore.SqlServer.


Описание
Я пробую сделать аналогичный проект.
Ссылка на проект - link // github.com

Я пробую повторить метод - `GetPosts(int index, int pageSize, string tag = null)`
Я хочу сделать аналогичный асинхронный метод с произвольным запросом.
Запрос например: `query = query.Where(p => p.ContactName.Contains("Maria"));`


Я пробую сделать простой метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public Customer GetCustomers()
{
    Customer result = new Customer();
 
    using (var context = ContextFactory.CreateDbContext(ConnectionString))
    {
      var query = context.Customers.AsQueryable();                
      query = query.Where(p => p.ContactName.Contains("Maria")); //
      result = query as Customer;
    }
    return result;
}
Результат в строке `query = query.Where(p => p.ContactName.Contains("Maria"));` смотри картинку.

Вопрос
Как такой метод сделать асинхронным с таким же или другим запросом?

Попытка номер - 1. Результат - не работает
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public Task<Customer> GetCustomersTask()
        {
            // Customer result = new Customer();
 
            var result = new TaskCompletionSource<Customer>();
 
            using (var context = ContextFactory.CreateDbContext(ConnectionString))
            {
                Task.Run(() =>
                {
                    var query = context.Customers.AsQueryable();
                    query = query.Where(p => p.ContactName == "Maria");
 
                    result.SetResult(query as Customer);
                }
                );
            }
            return result.Task;
        }
Миниатюры
Как из асинхронного метода получить объект?   Как из асинхронного метода получить объект?  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.03.2020, 18:37
Ответы с готовыми решениями:

Как прекратить выполнение асинхронного метода
Есть форма. По событию mouseUp исполняется следующий код: _isDragging = false; if (_isClickOnly) { ...

Вызов асинхронного метода из события
Присваиваю событию ссылку на метод _mainView.StartBinaryTradeClickEventRaised += new EventHandler(OnStartBrTradeClickEventRaised); ...

Ожидание выполнение асинхронного метода
Всем привет. Помогите разобраться с асинхронным программированием. Пишу приложение для windows store Есть класс. В нем два асинхронных...

24
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.03.2020, 17:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Soft17 Посмотреть сообщение
Почему так происходит?
Видать где-то запускаете этот метод еще раз, не дожидаясь окончания выполнения предыдущего запуска.
0
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
28.03.2020, 20:29  [ТС]
1.
Цитата Сообщение от kolorotur Посмотреть сообщение
Видать где-то запускаете этот метод еще раз, не дожидаясь окончания выполнения предыдущего запуска.
Где?
См. картинку.
Я вроде ничего лишнего не вижу


2. Как это работает?
Имеется метод:
C#
1
2
3
4
5
6
7
using (var context = ContextFactory.CreateDbContext(ConnectionString))
            {
                var query = context.Customers.AsQueryable();
                query = query.Where(p => p.ContactName.Contains("Maria")); //
 
                return await query.ToListAsync();
            }
Если я правильно понимаю, то:
1. Принцип работы - не асинхронно. Подключаемся к БД.
C#
1
using (var context = ContextFactory.CreateDbContext(ConnectionString))
2. Принцип работы - не асинхронно. Загружаем всю таблицу в память.
C#
1
var query = context.Customers.AsQueryable();
3. Принцип работы - не асинхронно. Выполняем "запрос".
C#
1
query = query.Where(p => p.ContactName.Contains("Maria"));
4. Принцип работы - асинхронно. Преобразуем "запрос" в список.
C#
1
return await query.ToListAsync();
Миниатюры
Как из асинхронного метода получить объект?  
0
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
28.03.2020, 20:36  [ТС]
так?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
28.03.2020, 20:38
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
Где?
Где-то в вызывающих методах.

Цитата Сообщение от Soft17 Посмотреть сообщение
Как это работает?
Выполняется запрос к базе, асинхронно ожидается ответ и возвращается результат.

Цитата Сообщение от Soft17 Посмотреть сообщение
Принцип работы - не асинхронно. Подключаемся к БД.
Нет.
При создании экземпляра контекста соединение с базой не устанавливается.

Цитата Сообщение от Soft17 Посмотреть сообщение
Принцип работы - не асинхронно. Загружаем всю таблицу в память.
Нет.
AsQueryable ничего в память не загружает, а просто приводит к соответствующему интерфейсу.
В данном случае этот вызов вообще не нужен и из предложенного мной варианта я его убрал.
Зачем вы его вернули — не ясно.

Цитата Сообщение от Soft17 Посмотреть сообщение
Принцип работы - не асинхронно. Выполняем "запрос".
Нет.
Where создает объект, представляющий собой запрос.
Сам запрос не выполняется.

Цитата Сообщение от Soft17 Посмотреть сообщение
Принцип работы - асинхронно. Преобразуем "запрос" в список.
Вся работа выполняется в этом вызове: открывается соединение с базой, отправляется запрос, асинхронно ожидается ответ и преобразуется в список.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
28.03.2020, 22:24  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
AsQueryable ничего в память не загружает, а просто приводит к соответствующему интерфейсу.
В данном случае этот вызов вообще не нужен и из предложенного мной варианта я его убрал.
Зачем вы его вернули — не ясно.
Списал отсюда: Раздел: "Давайте рассмотрим отличия между ToList AsEnumerable AsQueryable", статья: Ускоряемся в Entity Framework Core // habr.com
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.03.2020, 22:24

Приведите пример асинхронного метода
Привет! Я нашел много способов асинхронных операций в java, но что то все не то. Мне не нужен целый класс, наследованный от AsyncTask. ...

[wp 8.1] Вернуть значение из асинхронного метода
Есть код: public void openmyText() { string myTextit= LoadmyTextFromIsolatedStorage().ToString(); // не работает...

Принцип работы асинхронного метода BeginReceive
Здравствуйте. Можете объяснить как работает BeginReceive у сокетов? Сначала метод вызывается, указываются параметры; затем он ждет...

Юнит-тест для асинхронного метода
Доброго всем времени суток! В теме &quot;Логирование при использовании многопоточности&quot; уважаемый kolorotur помог мне написать...

Передача параметров и возврат значений из асинхронного метода
Для примера есть метод, который по замыслу должен в асинхронном режиме возвращать содержимое страницы. private async...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru