C# DataGridView从内存中加载图像异常
我已将DataTable绑定到DataGridView。DataTable最多填充30000行。DataGridView应该在填充DataTable时显示其内容,由于某些计算过程,这可能需要3分钟 每行包含文本单元格和两个图像单元格。起初,我将所有图像直接加载到数据表中,但在某个点(~10000行)程序崩溃,因为系统内存不足。所以我稍微修改了我的代码。问题是,这些图像占用了大量内存。现在我只加载用户可以看到的图像。这有很大帮助,而且系统在加载30000行时不再崩溃 该问题仅在大量滚动行时发生。我使用Alireza Maddah提供的代码设置图像:C# DataGridView从内存中加载图像异常,c#,datagridview,datatable,out-of-memory,virtual,C#,Datagridview,Datatable,Out Of Memory,Virtual,我已将DataTable绑定到DataGridView。DataTable最多填充30000行。DataGridView应该在填充DataTable时显示其内容,由于某些计算过程,这可能需要3分钟 每行包含文本单元格和两个图像单元格。起初,我将所有图像直接加载到数据表中,但在某个点(~10000行)程序崩溃,因为系统内存不足。所以我稍微修改了我的代码。问题是,这些图像占用了大量内存。现在我只加载用户可以看到的图像。这有很大帮助,而且系统在加载30000行时不再崩溃 该问题仅在大量滚动行时发生。我
public void GetVisibleCells(DataGridView dgv)
{´
ClearImages()
var vivibleRowsCount = dgv.DisplayedRowCount(true);
var firstDisplayedRowIndex = dgv.FirstDisplayedCell.RowIndex;
var lastvibileRowIndex = (firstDisplayedRowIndex + vivibleRowsCount) - 1;
for (int rowIndex = firstDisplayedRowIndex; rowIndex <= lastvibileRowIndex; rowIndex++)
{
var cells = dgv.Rows[rowIndex].Cells;
foreach (DataGridViewCell cell in cells)
{
if (cell.Displayed)
{
// This cell is visible...
// SET IMAGES TO ROW AND SAVE INDEX
}
}
}
}
public void GetVisibleCell(DataGridView dgv)
{´
ClearImages()
var vivibleRowsCount=dgv.DisplayedRowCount(true);
var firstDisplayedRowIndex=dgv.FirstDisplayedCell.RowIndex;
var lastvibileRowIndex=(firstDisplayedRowIndex+ViviblerowCount)-1;
对于(int rowIndex=firstDisplayedRowIndex;rowIndex尝试
private void ClearNotVisibleImages()
{
foreach(var row in this.GetNotVisibleDataRowsWithImages())
{
var cell = row["Image"];
Image image = (Image)(cell .Content);
cell.Content = null;
image.Dispose();
}
// If it will be really needed
GC.Collect();
// Improved Thanks @rentanadviser
GC.WaitForPendingFinalizers();
GC.Collect();
}
设法
private void ClearNotVisibleImages()
{
foreach(var row in this.GetNotVisibleDataRowsWithImages())
{
var cell = row["Image"];
Image image = (Image)(cell .Content);
cell.Content = null;
image.Dispose();
}
// If it will be really needed
GC.Collect();
// Improved Thanks @rentanadviser
GC.WaitForPendingFinalizers();
GC.Collect();
}
设法
private void ClearNotVisibleImages()
{
foreach(var row in this.GetNotVisibleDataRowsWithImages())
{
var cell = row["Image"];
Image image = (Image)(cell .Content);
cell.Content = null;
image.Dispose();
}
// If it will be really needed
GC.Collect();
// Improved Thanks @rentanadviser
GC.WaitForPendingFinalizers();
GC.Collect();
}
设法
private void ClearNotVisibleImages()
{
foreach(var row in this.GetNotVisibleDataRowsWithImages())
{
var cell = row["Image"];
Image image = (Image)(cell .Content);
cell.Content = null;
image.Dispose();
}
// If it will be really needed
GC.Collect();
// Improved Thanks @rentanadviser
GC.WaitForPendingFinalizers();
GC.Collect();
}
确保图像没有任何链接。您还可以调用GC.Collect()
在清除图像以清理大型对象堆后。但是,这会降低响应速度。此外,我会首先检查哪些图像不再可见,并仅清除那些图像,而不是全部清除。确保图像没有任何链接。您也可以调用GC.Collect()
在清除图像以清理大型对象堆后。但是,这会降低响应速度。此外,我会首先检查哪些图像不再可见,并仅清除那些图像,而不是全部清除。确保图像没有任何链接。您也可以调用GC.Collect()
在清除图像以清理大型对象堆后。但是,这会降低响应速度。此外,我会首先检查哪些图像不再可见,并仅清除那些图像,而不是全部清除。确保图像没有任何链接。您也可以调用GC.Collect()
清除图像以清理大型对象堆后。但是,这会降低响应速度。此外,我会首先检查哪些图像不再可见,并仅清除那些图像,而不是全部清除。您应该使用分割内容页(例如,每页100个图像)这可以防止内存不足异常。您可以尝试处理旧的可见单元格图像,
另请参见您应该使用分割内容页(例如每页100个图像)这可以防止内存不足异常。您可以尝试处理旧的可见单元格图像,
另请参见您应该使用分割内容页(例如每页100个图像)这可以防止内存不足异常。您可以尝试处理旧的可见单元格图像,
另请参见您应该使用分割内容页(例如每页100个图像)这可以防止内存不足异常。您可以尝试处理旧的可见单元格图像,
另请参见我发现我将错误的单元格设置为null…但是我集成了dispose(),这进一步提高了性能。谢谢!!!我发现我将错误的单元格设置为null…但是我集成了dispose())这将进一步提高性能。谢谢!!!我发现我将错误的单元格设置为null…但是我集成了dispose(),这将进一步提高性能。谢谢!!!我发现我将错误的单元格设置为null…但是我集成了dispose())这会进一步提高性能。谢谢!!!谢谢你的链接。我会投票给你并改进答案。谢谢你的链接。我会投票给你并改进答案。谢谢你的链接。我会投票给你并改进答案。谢谢你的链接。我会投票给你并改进答案。你考虑过加载thumb吗将缩略图加载到单元格而不是整个图像文件?是否考虑将缩略图加载到单元格而不是整个图像文件?是否考虑将缩略图加载到单元格而不是整个图像文件?是否考虑将缩略图加载到单元格而不是整个图像文件?