2009-09-23 3 views
0

Я хочу, чтобы вызовы метода были параллельными. В этом методе я вычисляю некоторое значение (очень быстро) и записываю значение этого вычисления в таблицу базы данных.Темы застряли в MySqlCommand.ExecuteNonQuery()

Поэтому я использую Threadpool

ThreadPool.QueueUserWorkItem((state) => { 
       method(); 
      }); 

Через некоторое время вычисления (не детерминированным, время, когда это происходит, меняется, иногда через несколько минут, иногда через несколько часов) Threadpool полон, но не с потоком метода(), но с потоком моего класса mysql, который вызывает MySqlCommand.ExecuteNonQuery.

Есть ли у кого-нибудь идеи, как этого избежать? В документации по классам mysql я обнаружил, что вы не можете завершить исполняемый запрос, но как избежать таких проблем?

ответ

5

Нужно ли записывать все значения в БД после их расчета, или вы можете подождать, пока у вас их нет, и выполните пакетное обновление, где вы вставляете их много?

Здесь вы можете столкнуться с проблемой блокировки, если все потоки пытаются записывать в одну и ту же таблицу одновременно. Поэтому попробуйте сохранить номера локально, а затем отправить их в одну большую партию

+0

ok Теперь я добавляю запросы в список и отправляю этот список каждую минуту, но теперь я, когда заполняю список в своих потоках, и через минуту отправлю запросов, перечисление списка изменяется в потоках, что относительно этого? Я попытался заблокировать (список) {// отправить запросы}, но это не работает –

+0

oh ... думаю, у меня было недоразумение о механизме блокировки :) Теперь я блокирую другой объект при отправке списка и при заполнении списка –

Смежные вопросы