我是vb.net的新手,我有一个问题。当我将大量数据加载到我的数据网格时,程序会冻结,直到加载所有数据。
我的问题是。当数据被加载到网格中时,程序可能会被解冻,如果是这样,你可以给我看一个简单的例子。
最后我的问题是。这是一个好主意还是坏主意,为什么?
答案 0 :(得分:2)
您可以使用DataGridView.VirtualMode,它专门用于展示大量数据。
另一种方法是首先加载到数据表(可以在后台线程中),然后分配给DGV.Datasource,如here所述。但要注意这种方法,DataTable在一定数量的记录之后也会变得很慢(我的大概估计是> 100K)。
答案 1 :(得分:-1)
我认为这是一个好主意,在这个现代时代,我认为你应该利用技术所提供的最大优势,那就是说,让我先解释一下你的问题的解决方案和Windows窗体的基础知识应用程序,WPF或您尝试使用的任何工作。你的表单基本上是在一个被称为"主线程"的线程上运行,只要主线程忙于执行一个进程,它就不能处理其他事件或任务,比如给出对某些输入的回应,在更简单的术语中,人们可能会说它被挂起了#34;或者"冷冻"。如果您正在处理大量数据或长时间处理,那么避免此问题的最简单方法是将某个任务移动到另一个线程。为此,您可以使用System.Threading类或BackgroundWorker。在线程中,您可以根据需要使用ThreadPool或线程。 我将教你如何使用线程。 首先,输入繁忙的时间,将代码放在一个单独的代码块中,函数/ sub / etc。
Private Sub abc()
'code here
End Sub
然后声明一个线程并将其发送到函数/ sub / etc。这包含你花时间代码。
Dim thr As New System.Threading.Thread(AddressOf abc)
然后你可以设置该线程的一些属性,如它的优先级等。然后你最终启动它
thr.Start
但是这里有一个棘手的部分,当你从另一个线程引用一个线程的对象或控件时,你必须请求它,这样你就不会干扰它,而任何其他线程可能也正在使用它。在您的情况下,请使用下面的代码
If datagridview1.InvokeRequired = True Then
Invoke(sub() datagridview1.enabled = false) 'or whatever you want to do with it or assign any values to it
Else
datagridview1.enabled = false 'or whatever you want to do with it or assign any values to it
End If