Здравствуйте, Danchik, Вы писали:
D>А они типа не используют потоки. Даже одна таска запускается в разных потоках во время своей жизни.
Разве выделенное всегда верно?
D>Тут у вас получается что в Task Secheduler добавилось два таска. Один пошел к базе, задержался на IO операции, второй начал работу, тоже полез к базе, нарвался исключение DataProvider.
S>>В библиотеке сделано множество ХххAsync расширений. Но по факту получается, что пользоваться ими в полной мере нельзя. Печально немного.
D>Хотите два паралельно работающих таска — создавайте два конекшина. Их создание дешевая операция.
D>Мы конечно можем поддержать здесь MARS, но это не лучшее решение, количество таких конекшинов ограничено да и не все провайдеры поддерживают.
D>С нашей стороны было бы неплохо выбросить правильное исключение если это возможно.
Вот коллега romangr чуть выше покопался в исходниках и пишет:
Немного покопав исходники linq2db видно, что при выполнении запросов DataConnection не создает на каждый запрос новую DbCommand, а переиспользует уже имеющуюся,
(смотреть реализацию свойства Command и метод InitCommand) что и приводит к такому поведению.
Он не прав?
Если создавать по новому DbCommand на запрос — будет работать?
D>Потом захочется два апдейта запустить паралельно — блокировать второй пока первый не прошел? Тогда зачем весь этот цирк c WhenAll?
Блокировки оставить на откуп СУБД и пользователю библиотеки. Как напишет, так СУБД пусть и исполняет.