我的應用程序有點問題。 我有一個數據庫編輯器,當我嘗試更新數據庫文件時有時會掛起。並非每次,而是經常發生,並且每次在數據庫發生任何更改之前都會發生。我想這是因爲沒有使用多線程。儘管我最近纔開始學習編程,但即使閱讀了幾條多線程解釋之後,我仍然迷失了方向。有人可以向我解釋我應該如何在我的具體示例中實現它?什麼是多線程的最佳方式?
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();
}
}
什麼'刷新(leaderboardBox );'do? –
注意,注意參數名稱爲'winner'和'loser'的sql注入 – smoksnes
首先,你提供的代碼看起來並不是超級笨重,但是看起來像你這樣做在GUI線程中,你應該避免這種情況。嘗試使用'BackgroundWorker',如這裏所述http://stackoverflow.com/questions/6365887/can-you-link-to-a-good-example-of-using- backgroundworker-without-place-it-on-a – smoksnes