Работа с базой данных через Threadpool или Asyn - PullRequest
0 голосов
/ 01 декабря 2009

У меня есть база данных с большим количеством записей. (Значения базы данных обновляются через веб-сервис)

Каждая запись / строка имеет тип (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

1 Ответ

1 голос
/ 01 декабря 2009

Если вы не используете .net 4.0 - используйте ThreadPool Я бы создал функцию, которая получала бы строку (событие лучше, если вы конвертируете строки в объекты со строгим типом в DAL), которые она должна обрабатывать, и делала бы то же самое с ней - что-то вроде

using System;
using System.Threading;

namespace SmallConsoleAppForTests
{
class Program
{

    private static AutoResetEvent[] events;

    static void Main(string[] args)
    {

        int dataLength = 3;
        // creating array of AutoResetEvent for signalling that the processing is done
        AutoResetEvent[] events = new AutoResetEvent[dataLength];

        // Initializing the AutoResetEvent array to "not-set" values;
        for (int i = 0; i < dataLength; i++)
            events[i] = new AutoResetEvent(false);

        //Processing the data
        for (int i = 0; i < dataLength; i++)
        {
            var data = new MyWorkItem { Event = events[i], Data = new MyDataClass() };

            ThreadPool.QueueUserWorkItem(x =>
            {
                var workItem = (MyWorkItem)x;
                try
                {
                    // process the data

                }
                catch (Exception e)
                {
                    //exception handling
                }
                finally
                {
                    workItem.Event.Set();
                }
            }, data);
        }

        //Wait untill all the threads finish
        WaitHandle.WaitAll(events);
    }




}

public class MyWorkItem
{
    public AutoResetEvent Event { get; set; }
    public MyDataClass Data { get; set; }
}

// You can also use DataRow instead
public class MyDataClass
{
    //data
    //
}
}

Если вы используете .net 4.0 - изучите задачи и параллельные расширения (PLINQ)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...