Re[6]: Tasks
От: swimmers  
Дата: 20.04.20 16:12
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, swimmers, Вы писали:

S>А чего именно вы хотите добиться при помощи параллельной загрузки обоих запросов?
S>На первый взгляд, как раз два await один за другим — то, что доктор прописал.

Хочу запросить 100500 справочников.
И пусть сервер сам при необходимости параллелит запросы, как может. Не может — тоже ок. Пусть выполняет последовательно.
Не хочу вникать в его трудности.
Хочу написать простой и потенциально эффективный код.
Re[5]: Tasks
От: Danchik Украина  
Дата: 20.04.20 23:08
Оценка: +1
Здравствуйте, swimmers, Вы писали:

S>Здравствуйте, Danchik, Вы писали:


D>>А они типа не используют потоки. Даже одна таска запускается в разных потоках во время своей жизни.

S>Разве выделенное всегда верно?
D>>Тут у вас получается что в Task Secheduler добавилось два таска. Один пошел к базе, задержался на IO операции, второй начал работу, тоже полез к базе, нарвался исключение DataProvider.

S>>>В библиотеке сделано множество ХххAsync расширений. Но по факту получается, что пользоваться ими в полной мере нельзя. Печально немного.


D>>Хотите два паралельно работающих таска — создавайте два конекшина. Их создание дешевая операция.

D>>Мы конечно можем поддержать здесь MARS, но это не лучшее решение, количество таких конекшинов ограничено да и не все провайдеры поддерживают.

D>>С нашей стороны было бы неплохо выбросить правильное исключение если это возможно.


S>Вот коллега romangr чуть выше покопался в исходниках и пишет:

S>

S>Немного покопав исходники linq2db видно, что при выполнении запросов DataConnection не создает на каждый запрос новую DbCommand, а переиспользует уже имеющуюся,
S>(смотреть реализацию свойства Command и метод InitCommand) что и приводит к такому поведению.

S>Он не прав?
S>Если создавать по новому DbCommand на запрос — будет работать?

Что теперь сделаем с транзакциями и еще кучей нюансов? DataConnection это враппер над ОДНИМ конекшином, и пускай так и остается.

D>>Потом захочется два апдейта запустить паралельно — блокировать второй пока первый не прошел? Тогда зачем весь этот цирк c WhenAll?

S>Блокировки оставить на откуп СУБД и пользователю библиотеки. Как напишет, так СУБД пусть и исполняет.

Вот не понял.
Re[6]: Tasks
От: Danchik Украина  
Дата: 20.04.20 23:20
Оценка:
Здравствуйте, takTak, Вы писали:


T>

S>> ctx.GetTable<Table1>().ToArrayAsync(),


T>ctx — это ling2db или это Entity Framework ?


T>для EF рекомендуют делать так :

T>https://stackoverflow.com/questions/41749896/ef-6-how-to-correctly-perform-parallel-queries

Какого милого сюда EF приплели, но ответ тот же: создавать новый конекшин на каждый запрос.
Re: Tasks
От: swimmers  
Дата: 14.04.21 18:27
Оценка:
Здравствуйте, swimmers, Вы писали:

S>Коллеги, подскажите, насколько корректно пытаться писать такой код?

S>Или это в принципе не правильно?

S>
S>            var tasks = Task[]
S>            {
S>                ctx.GetTable<Table1>().ToArrayAsync(),
S>                ctx.GetTable<Table2>().ToArrayAsync(),
S>        // Здесь еще подобные строки
S>            };

S>            tasks.WaitAll(); // Валится с ошибкой InvalidOperationException: Выполнение команды не может быть продолжено до завершения отложенной асинхронной операции.

S>


Прочитал roadmap v4.0
Я правильно понимаю, что в результате изменений мой код выше заработает без ошибок?
Re[2]: Tasks
От: Mace Windu  
Дата: 15.04.21 08:14
Оценка:
Здравствуйте, swimmers, Вы писали:

S>Прочитал roadmap v4.0

S>Я правильно понимаю, что в результате изменений мой код выше заработает без ошибок?

Неправильно. В 4.0 сделан рефакторинг, который позволяет несколько активных ридеров иметь на одном конекте для тех провайдеров которые это умеют (т.е. все кроме Mysql/postgresql). В данном же случае идет работа с одним конектом из нескольких потоков одновременно, а конекты к базе никогда не были потокобезопасными.
Re[3]: Tasks
От: Mace Windu  
Дата: 15.04.21 08:15
Оценка:
Здравствуйте, Mace Windu, Вы писали:

MW>Здравствуйте, swimmers, Вы писали:


S>>Прочитал roadmap v4.0

S>>Я правильно понимаю, что в результате изменений мой код выше заработает без ошибок?

MW>Неправильно. В 4.0 сделан рефакторинг, который позволяет несколько активных ридеров иметь на одном конекте для тех провайдеров которые это умеют (т.е. все кроме Mysql/postgresql). В данном же случае идет работа с одним конектом из нескольких потоков одновременно, а конекты к базе никогда не были потокобезопасными.


Добавлю, что это не наше ограничение, а так реализованы ado.net провайдеры.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.