Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, swimmers, Вы писали: S>А чего именно вы хотите добиться при помощи параллельной загрузки обоих запросов? S>На первый взгляд, как раз два await один за другим — то, что доктор прописал.
Хочу запросить 100500 справочников.
И пусть сервер сам при необходимости параллелит запросы, как может. Не может — тоже ок. Пусть выполняет последовательно.
Не хочу вникать в его трудности.
Хочу написать простой и потенциально эффективный код.
Здравствуйте, 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>Блокировки оставить на откуп СУБД и пользователю библиотеки. Как напишет, так СУБД пусть и исполняет.
Здравствуйте, 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
Я правильно понимаю, что в результате изменений мой код выше заработает без ошибок?
Здравствуйте, swimmers, Вы писали:
S>Прочитал roadmap v4.0 S>Я правильно понимаю, что в результате изменений мой код выше заработает без ошибок?
Неправильно. В 4.0 сделан рефакторинг, который позволяет несколько активных ридеров иметь на одном конекте для тех провайдеров которые это умеют (т.е. все кроме Mysql/postgresql). В данном же случае идет работа с одним конектом из нескольких потоков одновременно, а конекты к базе никогда не были потокобезопасными.
Здравствуйте, Mace Windu, Вы писали:
MW>Здравствуйте, swimmers, Вы писали:
S>>Прочитал roadmap v4.0 S>>Я правильно понимаю, что в результате изменений мой код выше заработает без ошибок?
MW>Неправильно. В 4.0 сделан рефакторинг, который позволяет несколько активных ридеров иметь на одном конекте для тех провайдеров которые это умеют (т.е. все кроме Mysql/postgresql). В данном же случае идет работа с одним конектом из нескольких потоков одновременно, а конекты к базе никогда не были потокобезопасными.
Добавлю, что это не наше ограничение, а так реализованы ado.net провайдеры.