Akhil Jain Ответов: 3

Могу ли я использовать многопоточность при добавлении данных в datarow в datatable в C# ?


у меня есть Datatable, и я добавляю данные в 3 столбца datatable, вызывая функцию(что необходимо).это занимает около 15 минут, чтобы обработать 7000 записей есть ли способ использовать многопоточность и сделать ее быстрее ?


foreach (DataRow row in dtTaskandBugs.Rows)
        {
            int id = Convert.ToInt32(row["Id"]);
            int storyid = GetStoryid(id);//68725; 70581//GetStoryid(Convert.ToInt32(row["Id"])); //get task or bug storyid

            int FeatureID = Fidname(storyid); //get Featureid of the the story
            string FeatureName = FeatureID == 0 ? "Anonymous" : fname(FeatureID);


            row["Storyid"] = storyid;
            row["FeatureID"] = FeatureID;
            row["FeatureName"] = FeatureName;
        }


Что я уже пробовал:

у меня есть Datatable, и я добавляю данные в 3 столбца datatable, вызывая функцию(что необходимо).это занимает около 15 минут, чтобы обработать 7000 записей есть ли способ использовать многопоточность и сделать ее быстрее ?

3 Ответов

Рейтинг:
2

George Swan

Я хотел бы использовать Семафоры. Это класс, который "вентилирует" количество одновременных чтений базы данных до заданного уровня. Как только этот уровень достигнут, существующее чтение должно завершиться, прежде чем новое чтение будет разрешено начать.


//A method to asynchronously load data from the database
private async Task<Order> LoadOrderFromDbAsync(int orderId){//....}
 private SemaphoreSlim semaphoreSlim;
 private async Task<List<Order>> GatedConcurrentLoadOfOrdersAsync(IEnumerable<int> orderIds)
        {
           using (semaphoreSlim = new SemaphoreSlim(maxConcurrencyLevel))
          {
            var tasks = new List<Task<Order>>();
            foreach (int orderId in orderIds)
            {
                //start each task off but don't await it
                //tasks are started by simply invoking the async method
                Task<Order> task = GatedLoadOrderFromDatabaseAsync(orderId);
                tasks.Add(task);
            }

            //await them all to complete
            Order[] loadedOrders = await Task.WhenAll(tasks);
            return loadedOrders.ToList();
         }
        }

 private async Task<Order> GatedLoadOrderFromDatabaseAsync(int orderId)
        {
            //queue here if max number of threads are already active
            await semaphoreSlim.WaitAsync();
           try
            {
              return  await LoadOrderFromDbAsync(orderId);
                
            }
            finally
            {
                //open the gate to let a queued thread run
                semaphoreSlim.Release();
            }
        }


Рейтинг:
2

Dave Kreskowiak

При добавлении строк в таблицу данных? Не совсем.

Из документации MSDN по DataTable:

Цитата:
Этот тип безопасен для многопоточных операций чтения. Вы должны синхронизировать все операции записи.

Хотя для добавления записей в объект DataTable можно использовать несколько потоков, добавление строк в объект DataTable должно быть синхронизировано. Это означает, что только один поток может добавлять поток данных в таблицу одновременно, по существу превращая операцию в однопоточную операцию. Вы практически не получите никакой выгоды от использования нескольких потоков.

Реальный вопрос должен заключаться в том, почему вы добавляете так много строк к объекту DataTable в первую очередь? Скорее всего, вам не нужны все эти строки в DataTable.


Рейтинг:
0

F-ES Sitecore

Попробуйте Параллельно.инструкция foreach

Как это сделать: напишите простую параллель.Цикл ForEach | Microsoft Docs[^]

Нет никакой гарантии, что это повысит производительность, есть много факторов, связанных с этим, таких как количество ядер на сервере вашего сайта, архитектура SQL server и все виды. Вы, скорее всего, получите лучшую производительность рефакторинга своей функции или не будете использовать какой-то другой метод для получения данных в своей базе данных.


Afzaal Ahmad Zeeshan

5ед. Совершенно верно, что это не гарантирует никакого улучшения. Только то, что вы можете спать по ночам, учитывая тот факт, что Вы играли в свою игру. :смеяться: