Есть такой вот метод
async Task<DataTable> TestAsync(string mySelectQuery, DB2Connection myConnection)
{
Task<DataTable> us = Task.Factory.StartNew(() =>
{
using (DB2Command myCommand = new DB2Command(mySelectQuery, myConnection))
{
using (DbDataReader myReader = myCommand.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(myReader);
return dt;
}
}
});
return await us;
}
Вызываю так:
IEnumerable<Task<DataTable>> tasks = from unds in new [] { "select * from test1", "select * from test2" } select TestAsync(unds, myConnection);
DataTable[] uds = await Task.WhenAll(tasks);
И выдается исключение
Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key constraints
Кто то может мне объяснить почему в этом случае DataTable дает ошибку? он же локальный, а при асинхре ведь метод копируется и все его локальные переменные тоже?
А вот если сделать вот так, то ошибки нет!
lock (ob)
{
DataTable dt = new DataTable();
dt.Load(myReader);
return dt;
}
Класс DB2Connection не предназначен для работы в двух потоках сразу. Вам надо создавать отдельное соединение на каждый запрос.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости