. NET Оптимизация загрузки данных - PullRequest
2 голосов
/ 30 марта 2020

Я видел, как несколько потоков говорили о похожих проблемах, но ни один из них не объяснял мою ситуацию и не объяснял, как правильно решить эту проблему.

Текущая проблема, с которой я сталкиваюсь, заключается в том, что у меня есть DataGridView, который загружает в данных из базы данных SQLite асинхронно, но занимает слишком много времени.

Способ добавления данных в базу данных SQLite - загрузка файла JSON, его десериализация и добавление десериализованного файла в виде класса в таблицу. .

В настоящее время в базе данных имеется 20 строк, и она состоит из 8 значений, например, ID, имени, цены.

Похоже, проблем нет, верно? Теперь, когда я хочу добавить нового игрока в список, например,

// Note this is pseudo-code as my code is a little longer (like the Process of creating a Player)
// So I'll just TL;DR the code as I think this is the most crucial information.
public async void btnAddPlayer(){
 string website = "website.com/playerdata.json";
 // This gets user data, deserializes it, creates a player object and returns it.
 var player = GetUserDataFromJSON(website);  
 // This adds a Player asynchronously to the database
 await database.AddPlayer(player);
}

Также стоит отметить, что JSON состоит из таблицы, созданной из [UnixTime, Price]. Я получаю JSON, создав HTTPWebRequest / Response и читаю его с помощью StreamReader.

(Создание веб-запроса -> Получение ответа -> StreamReader -> Десериализация)

Перед добавлением проигрывателя выбирается самая высокая цена, поэтому:

// This is normally no function, just put it in a function to break it down separately for this purpose
public void Function(...) {
 var highestPrice = 0;
 var highestPriceDate = DateTime.MinValue;
 foreach(var price in table.Price) {
 if(price >= highestPrice) {
 highestPrice = price;
 highestPriceDate = UnixToUTC(table.UnixTime);
}

Проблема Я сталкиваюсь с функцией добавления, которая заключается в том, что добавление Player (и его отображение в DataGridView) занимает около 1 секунды. Я визуально обновляю способ клонирования строки [0] и изменения ее данных. Результат, который я жду, составляет несколько мс, поскольку он просто получает данные из JSON, десериализует их (сравнивает цены), добавляет их в БД и добавляет их в DataGridView.

Теперь я также есть функция REFRE SH ( САМАЯ БОЛЬШАЯ ПРОБЛЕМА! ), которая получает новейшие данные для каждого игрока, доступные в таблице SQLite.

Поэтому я впервые получаю доступ базы данных и получить всех игроков.

public List<Player> GetAllPlayers(){
 // To access Table and make a query
 var query = dbConnection.Table<Player>();
 allPlayers = await query.ToListAsync();
 await conn.CloseAsync();
 return allPlayers;
}

Затем я вызываю асин c Задачу обновить их всех, которая выглядит следующим образом:

public async Task UpdateAllPlayers() {
 var allPlayers = await database.GetAllPlayers() {
  foreach (var player in allPlayers) {
   // Boolean "true" is marking whether it is an update.
   // If it is true, it is basically the same as btnAddPlayer(), but
   // The only difference is that it does not call
   // database.AddPlayer(player);
   // It instead calls:
   // database.UpdatePlayer(player);
   await GetPlayerInfo(player.Name, player.ID, player.Type, true);
   }
  }

Чтобы визуально обновить это, Я очищаю все строки в DataGridView, наконец GetAllPlayers () и добавляю всех этих игроков в a для l oop, дублируя строку [0] и редактируя ее для каждого игрока.

Проблема с этой функцией что это заняло 7 секунд только для 21 игрока. Я думаю, что это время резко возрастет, когда будет добавлено больше игроков. Поэтому, если бы у меня было ~ 120 игроков (что является моей текущей целью), я бы ждал каждого обновления в течение 42 секунд. Программа не отвечает в течение этих секунд, что вызывает у меня сомнения по поводу ее сбоя et c. также. То, что я жду, - это обычно время загрузки от X секунд для Y Players. Realisti c звучит 1 секунду для 20 игроков, но мой текущий результат еще далек от этого.

...