.net 如何提高从数据库获取图像和文本的速度?

.net 如何提高从数据库获取图像和文本的速度?,.net,winforms,linq,c#-4.0,.net,Winforms,Linq,C# 4.0,我试图使用以下代码,但我的应用程序并没有获得良好的性能 我在“dt_images.ToList()”中列出了2000幅图像 在cs中: foreach (var dr in dt_Images.ToList()) { BTN = new Button(); BTN.Name = dr.Name.ToString(); BTN.Image = dr.Image;

我试图使用以下代码,但我的应用程序并没有获得良好的性能

我在“dt_images.ToList()”中列出了2000幅图像

在cs中:

foreach (var dr in dt_Images.ToList())
            {
                BTN = new Button();
                BTN.Name = dr.Name.ToString();
                BTN.Image = dr.Image;
                BTN.Text = dr.text.ToString();
                flowLayoutPanel1.Controls.Add(BTN);
                BTN.Click += new EventHandler(this.pic_Click);
            }
我也尝试绑定listview,但没有达到预期的速度

使用flowLayoutPanel绑定时如何提高速度

我可以绑定控制中的直接数据源吗?那我用的是哪个控件


请帮帮我,我想,通常你只需要下载你展示的图片和周围的一些图片。
因此,如果你下载当前视频后5张和前5张,你的速度就可以了。

我认为,通常你只需要下载你展示的图片和周围的几张图片。
因此,如果您下载当前版本的5个after和5个before,您的速度就可以了。

我们不能总是提高性能,但我们绝对可以提高感知性能。假设您正在开发UI应用程序,请参考以下逻辑

作为应用程序启动的一部分,尝试获取所有图像和相关数据。这很费时,但别担心。将这些对象缓存在内存中(HashMap?)。当您发现需要为用户创建流面板时,请尝试在缓存中查找并快速渲染图像


您正在执行的sql强制执行数据库往返。尝试在没有where条件(批量提取)的情况下执行“选择*”以填充缓存

我们不能总是提高绩效,但我们绝对可以提高感知绩效。假设您正在开发UI应用程序,请参考以下逻辑

作为应用程序启动的一部分,尝试获取所有图像和相关数据。这很费时,但别担心。将这些对象缓存在内存中(HashMap?)。当您发现需要为用户创建流面板时,请尝试在缓存中查找并快速渲染图像


您正在执行的sql强制执行数据库往返。尝试在没有where条件(批量提取)的情况下执行“选择*”以填充缓存

也许您应该只在即将使用按钮时创建一个按钮。(或者是其中的一部分,如in的回答。)


即使您确实希望一次创建所有按钮,也最好使用一个按钮来创建它们。

也许您应该只在即将使用按钮时创建一个按钮。(或者是其中的一部分,如in的回答。)


即使您确实希望一次创建所有这些文件,也最好使用一个。

我可以看到您使用的是一个
FlowLayout
面板。我怀疑每次添加子控件时都需要重做整个布局,这可能也需要很多时间

你能试着用这种方式把整个循环圈围起来吗

flowLayoutPanel1.SuspendLayout();

foreach (var dr in dt_Images.ToList())
        {
            BTN = new Button();
            BTN.Name = dr.Name.ToString();
            BTN.Image = dr.Image;
            BTN.Text = dr.text.ToString();
            flowLayoutPanel1.Controls.Add(BTN);
            BTN.Click += new EventHandler(this.pic_Click);
        }

flowLayoutPanel1.ResumeLayout();

您甚至可以尝试通过使用答案禁用绘画来获得更好的性能

我可以看到您正在使用
FlowLayout
面板。我怀疑每次添加子控件时都需要重做整个布局,这可能也需要很多时间

你能试着用这种方式把整个循环圈围起来吗

flowLayoutPanel1.SuspendLayout();

foreach (var dr in dt_Images.ToList())
        {
            BTN = new Button();
            BTN.Name = dr.Name.ToString();
            BTN.Image = dr.Image;
            BTN.Text = dr.text.ToString();
            flowLayoutPanel1.Controls.Add(BTN);
            BTN.Click += new EventHandler(this.pic_Click);
        }

flowLayoutPanel1.ResumeLayout();

您甚至可以尝试通过使用答案禁用绘画来获得更好的性能

图像以BLOB数据的形式存储在数据库中,并且重量很重。是否可以预取此信息并将其保存在内存中。2000不是一个大的区块,只要你的图像相当小(KB,而不是MB)。我的所有图像都是KB,但需要2分钟来加载此表单@questzendatabase获取非常耗时。您可以通过在本地内存中缓存图像来缩短周转时间。如果您的应用程序允许,请尝试先初始化这2000个对象。my foreach循环需要2分钟才能执行。是否可以删除foreach循环@问题:请看我的回答。图片作为水滴数据存储在数据库中,重量很重。是否可以预取此信息并将其保存在内存中。2000不是一个大的区块,只要你的图像相当小(KB,而不是MB)。我的所有图像都是KB,但需要2分钟来加载此表单@questzendatabase获取非常耗时。您可以通过在本地内存中缓存图像来缩短周转时间。如果您的应用程序允许,请尝试先初始化这2000个对象。my foreach循环需要2分钟才能执行。是否可以删除foreach循环@请看我的答案