У меня небольшая проблема с моим приложением. У меня есть редактор базы данных, который иногда зависает, когда я пытаюсь обновить файл базы данных. Не каждый раз, но довольно часто, и каждый раз, когда это происходит прямо перед внесением каких-либо изменений в базу данных. Я решил, что это из-за того, что вы не используете многопоточность. В последнее время я только начал изучать программирование, и я потерял даже после прочтения нескольких многопоточных объяснений. Может ли кто-нибудь объяснить мне, как мне его реализовать в моем конкретном примере?Каков наилучший способ многопоточности?
private void adjustStatsButton_Click(object sender, EventArgs e) { ReadWrite.AdjustStats(winnerInput.Text, loserInput.Text); winnerInput.Text = ""; loserInput.Text = ""; Refresh(leaderboardBox); }
public class ReadWrite
{
public static void AdjustStats(string winner, string loser)
{
SQLiteConnection dbConnection = new SQLiteConnection("Data Source = Leaderboards.sqlite; Version = 3");
string sql = "SELECT * FROM leaderboard WHERE name='" + winner + "'";
SQLiteCommand command = new SQLiteCommand(sql, dbConnection);
dbConnection.Open();
SQLiteDataReader reader = command.ExecuteReader();
double wrating = Convert.ToDouble(reader["rating"]);
int wmatches = Convert.ToInt32(reader["matches"]);
int wwins = Convert.ToInt32(reader["wins"]);
sql = "SELECT * FROM leaderboard WHERE name='" + loser + "'";
command = new SQLiteCommand(sql, dbConnection);
reader = command.ExecuteReader();
double lrating = Convert.ToDouble(reader["rating"]);
int lmatches = Convert.ToInt32(reader["matches"]);
int lwins = Convert.ToInt32(reader["wins"]);
int llosses = Convert.ToInt32(reader["losses"]);
double RC = (1 - ((wrating - lrating)/200)) * 8;
if (RC < 0) RC *= -1;
if (RC < 4) RC = 4;
else if (RC > 12) RC = 12;
wmatches++;
wwins++;
lmatches++;
llosses++;
wrating += RC;
if (wrating < 0) wrating = 0;
lrating -= RC;
if (lrating < 0) lrating = 0;
double wwinrate = Convert.ToDouble(wwins)/wmatches;
double lwinrate = Convert.ToDouble(lwins)/lmatches;
sql = "UPDATE leaderboard SET rating=" + wrating + ", matches=" + wmatches + ", wins=" + wwins + ", winrate=" + wwinrate + " WHERE name='" + winner + "'";
command = new SQLiteCommand(sql, dbConnection);
command.ExecuteNonQuery();
sql = "UPDATE leaderboard SET rating=" + lrating + ", matches=" + lmatches + ", losses=" + llosses + ", winrate=" + lwinrate + " WHERE name='" + loser + "'";
command = new SQLiteCommand(sql, dbConnection);
command.ExecuteNonQuery();
dbConnection.Close();
}
}
Что 'Refresh (leaderboardBox); 'do? –
Обратите внимание, будьте осторожны с SQL-инъекцией с именами параметров' победитель' и 'loser'. – smoksnes
Во-первых, код, который вы предоставили, кажется, не очень тяжелый. Но кажется, что вы это делаете в GUI-потоке, которого вы должны избегать. Попробуйте использовать «BackgroundWorker», как указано здесь http://stackoverflow.com/questions/6365887/can-you-link-to-a-good-example-of-using- backgroundworker-without-placement-it-on-a – smoksnes