У меня есть база данных с большим количеством записей. (Значения базы данных обновляются через веб-сервис)
Каждая запись / строка имеет тип (id, имя xmlfile, операция, параметры, идентификатор операции, состояние), т.е.
мы выполняем операцию, как указано в «операции» в xmlfile
определяется как "xmlfilename" с параметрами для операции, указанными "параметры" ..
статусная часть «изначально» свободна, так как обновляется, как и в случае необходимости.
Я должен сделать эту (каждую строку) операцию, используя Threads ... один поток для каждого 'id'
количество записей. при условии, что в выборке из базы данных есть строки 'id' и выполняются "операции"
как я могу сделать это эффективно с максимальным параллелизмом и / или параллелизмом.
Есть ли лучший способ?
Что лучше всего подходит для Threadpool, пользовательских потоков или асинхронного программирования?
Редактировать Добавлено: вот псевдокод, который я пробовал
string operationId=null;
while(operationId = DBWorker.getNextFreeOperationId ())
//how do i check this?another query??untill there are operations with status "Free"
//,keep selecting operationids
//note db is updating asynchronously.
{
//retrieve all rows with operationid=operationId eg:800 . 1 thread/qid???? and
// status="free" ...
//there are multiple operations with same operationIds
DataRowCollection dbRows=DBWorker.retrieveQueuedEntries(operationId);
MyWorkItem workItem = new DBWorker.MyWorkItem();
workItem.DataRows = dbRows;
workItem.Event = new AutoResetEvent(false);
//MyWorkItem.DoWork will do the necessary "Operation"
ThreadPool.QueueUserWorkItem(new WaitCallback(workItem.DoWork),workItem);
}
--------------
MyWorkItem.DoWork(obj x){
//for brevity
for each DataRow row in this.DataRows
{
performOperation(row);//use row["operation"] ..
}
---------------
bool performOperation(DataRow row)
{
string operation = (string)row["operation"];//retrieve other similarly
switch(operation)
{
case Operations.Add: //call Add operation ..
...
}
}
------------
код выше использует .net2.0 .. не обеспечивает многопоточность ..
Сценарий может заключаться в том, что база данных обновляется с одного конца асинхронно, в то время как приведенный выше код будет одновременно работать как служба Windows.
1020 * ТНХ *
Amit