C# DataGridView从内存中加载图像异常

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行时不再崩溃 该问题仅在大量滚动行时发生。我

我已将DataTable绑定到DataGridView。DataTable最多填充30000行。DataGridView应该在填充DataTable时显示其内容,由于某些计算过程,这可能需要3分钟

每行包含文本单元格和两个图像单元格。起初,我将所有图像直接加载到数据表中,但在某个点(~10000行)程序崩溃,因为系统内存不足。所以我稍微修改了我的代码。问题是,这些图像占用了大量内存。现在我只加载用户可以看到的图像。这有很大帮助,而且系统在加载30000行时不再崩溃

该问题仅在大量滚动行时发生。我使用Alireza Maddah提供的代码设置图像:

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吗将缩略图加载到单元格而不是整个图像文件?是否考虑将缩略图加载到单元格而不是整个图像文件?是否考虑将缩略图加载到单元格而不是整个图像文件?是否考虑将缩略图加载到单元格而不是整个图像文件?