C# 程序占用了太多内存
我将数据库中的30行(路径中的文本和图像)加载到dataGridView中。每个图像的大小约为45-60kB。 当我的程序运行时,它使用30mb的RAM。如果我按C# 程序占用了太多内存,c#,C#,我将数据库中的30行(路径中的文本和图像)加载到dataGridView中。每个图像的大小约为45-60kB。 当我的程序运行时,它使用30mb的RAM。如果我按按钮3\u单击\u 2(加载接下来的30行),它将使用+20mb内存,每次。。。 我怎样才能解决我的问题 private void Form1_Load(object sender, EventArgs e) { SQL.Data_from_DB(0); //Load data from DB into Lists Loa
按钮3\u单击\u 2
(加载接下来的30行),它将使用+20mb内存,每次。。。
我怎样才能解决我的问题
private void Form1_Load(object sender, EventArgs e)
{
SQL.Data_from_DB(0); //Load data from DB into Lists
LoadTable(); //Load data from Lists into DataGridView
}
WinForms应用程序使用大约40 MB的内存显示一组图像,这一点也不少见。你真的有内存不足的错误吗?程序崩溃了吗?这里的问题是什么?可能的重复看起来就像每次加载一组30行的新数据时都试图抛出旧数据。如果是这样的话,那将是对您为旧的30行分配的所有图像调用Dispose()的好时机。您的图像是图标,对吗?因为这是一个非常小的位图大小-这是windows唯一可以显示的东西。如果这些是jpg,则会在加载时扩展为位图。你们的内存到了。@CodyGray我并没有任何错误,但在第四次点击按钮后,它使用了120mb,以此类推。。。在DataGridView中,每次点击都会有30幅图像在变化。
public void LoadTable()
{
dataGridView1.Rows.Clear();
VS.count_list = 0;
for(int i = 0; i< 30; i++)
{
dataGridView1.Rows.Add();
dataGridView1.Rows[VS.count_list].Cells[0].Value = UnixTimeStampToDateTime(Convert.ToInt32(SQL.Date[i], 10));
dataGridView1.Rows[VS.count_list].Cells[1].Value = SQL.Text[i];
dataGridView1.Rows[VS.count_list].Cells[2].Value =SQL.Likes[i];
dataGridView1.Rows[VS.count_list].Cells[3].Value = SQL.Reposts[i];
if (SQL.Image[i] != "-")
{
try
{
dataGridView1.Rows[VS.count_list].Cells[5].Value = LoaDimg(SQL.Image[i]);
}
catch
{
dataGridView1.Rows[VS.count_list].Cells[5].Value = null;
}
}
else
{
dataGridView1.Rows[VS.count_list].Cells[5].Value = null;
}
VS.count_list++;
}
}
private Image LoaDimg(string path)
{
Bitmap bitmap = new Bitmap(Directory.GetCurrentDirectory() + "\\1\\" + path + ".jpg");
return bitmap;
}
public static void Data_from_DB(int inp_num)
{
using (SqlConnection connection = GetConection())
{
string query = "SELECT * FROM [Table] WHERE Id BETWEEN @start AND @end";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@start", inp_num + 1);
command.Parameters.AddWithValue("@end", inp_num + 30);
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read()) {
Date.Add((String.Format("{0}", reader["Post_Date"].ToString())));
Text.Add((String.Format("{0}", reader["Post_Text"].ToString())));
Likes.Add((String.Format("{0}", reader["Post_Likes"].ToString())));
Reposts.Add((String.Format("{0}", reader["Post_Reposts"].ToString())));
Image.Add((String.Format("{0}", reader["Post_Image"].ToString())));
}
reader.Close();
}
connection.Close();
}
}
private void button3_Click_2(object sender, EventArgs e)
{
SQL.Date.Clear(); //Clear Lists
SQL.Text.Clear();
SQL.Likes.Clear();
SQL.Reposts.Clear();
SQL.Image.Clear();
dataGridView1.Rows.Clear();
row_num += 30;
SQL.Data_from_DB(row_num); //Load next 30
LoadTable();
}