Я видел, как несколько потоков говорили о похожих проблемах, но ни один из них не объяснял мою ситуацию и не объяснял, как правильно решить эту проблему.
Текущая проблема, с которой я сталкиваюсь, заключается в том, что у меня есть 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 игроков, но мой текущий результат еще далек от этого.