Silverlight 4.0 加载一个大的silverlight树视图(silverlight大师的问题!)
我有一张6400行的桌子。这是一个父子表,它有一个外键,在EF中是一个自关联引用 对于这个项目,必须加载所有树,当节点展开时加载数据对我来说不是一个解决方案 我试图一次加载所有节点/树,但它超过了maximun项:InnerException消息是“在对象图中可以序列化或反序列化的最大项数是”65536“ 然后,我尝试递归加载数据,但建立了最大simultanius连接http://msdn.microsoft.com/en-us/library/cc304129%28VS.85%29.aspx. 这是因为loadoperation是异步的,递归以非并行方式运行 最后,我写了这段代码来加载数据,它工作得很慢,但我认为这是一个肮脏的解决方案:Silverlight 4.0 加载一个大的silverlight树视图(silverlight大师的问题!),silverlight-4.0,ria,Silverlight 4.0,Ria,我有一张6400行的桌子。这是一个父子表,它有一个外键,在EF中是一个自关联引用 对于这个项目,必须加载所有树,当节点展开时加载数据对我来说不是一个解决方案 我试图一次加载所有节点/树,但它超过了maximun项:InnerException消息是“在对象图中可以序列化或反序列化的最大项数是”65536“ 然后,我尝试递归加载数据,但建立了最大simultanius连接http://msdn.microsoft.com/en-us/library/cc304129%28VS.85%29.aspx
Private Sub loadOperation_Completed(ByVal sender As Object, ByVal e As EventArgs)
Dim localloadOperation As LoadOperation(Of dimActivitats) = DirectCast(sender, LoadOperation(Of dimActivitats))
If Not localloadOperation.HasError Then
Dim llista = localloadOperation.Entities.ToList
If llista.Any AndAlso llista.First.idSubrogatPare Is Nothing Then
activitatsTree = llista
TreeViewTaula.DataContext = activitatsTree
End If
For Each i In llista
elementsWaitingForExpand.Push(i)
Next
End If
Dim take10 = 10
Dim IdsParentListOfElementsToProcessNow As New List(Of Integer)
While elementsWaitingForExpand.Count > 0 And take10 > 0
take10 -= 1
IdsParentListOfElementsToProcessNow.Add(elementsWaitingForExpand.Pop.idSubrogat)
End While
Dim q2 = CActx.GetDimActivitatsListChildQuery(IdsParentListOfElementsToProcessNow)
loadOperation = CActx.Load(Of dimActivitats)(q2)
AddHandler loadOperation.Completed, AddressOf loadOperation_Completed
ProgressBarTaula.Value = CActx.dimActivitats.Count
End Sub
我在找更优雅的信号灯?班长排队
在这里,您可以看到previeus解决方案由于simultanius连接而引发错误:
Private Sub loadOperation_Completed(ByVal sender As Object, ByVal e As EventArgs)
Try
Dim localloadOperation As LoadOperation(Of dimActivitats) = DirectCast(sender, LoadOperation(Of dimActivitats))
If Not localloadOperation.HasError Then
Dim llista = localloadOperation.Entities.ToList
If llista.Any AndAlso llista.First.idSubrogatPare Is Nothing Then
activitatsTree = llista
TreeViewTaula.DataContext = activitatsTree
End If
TreeViewTaula.Dispatcher.BeginInvoke(New loadLlistaDelegate(AddressOf loadLlista), llista)
End If
Catch ex As Exception
End Try
End Sub
Private Delegate Sub loadLlistaDelegate(ByVal llista As List(Of dimActivitats))
Private Sub loadLlista(ByVal llista As List(Of dimActivitats))
For Each item In llista
For Each fill In item.dimActivitatsChildren
Dim q2 = CActx.GetDimActivitatsChildQuery(fill.idSubrogat)
Dim newloadOperation = CActx.Load(Of dimActivitats)(q2)
AddHandler newloadOperation.Completed, AddressOf loadOperation_Completed
Next
Next
End Sub
您有没有想过以更优雅的方式重写此代码?您在web.config中的服务行为中是否将maxItemsInObjectGraph设置为最大值?e、 g
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<!--The service behavior for the RIA Service-->
<behavior name="RIAServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer **maxItemsInObjectGraph="2147483647"** />
如果在节点展开时加载数据不是一个选项,那么最好使用datagrid而不是treeview,并用过滤器/组显示层次结构?树不平衡,子树高度可能较深。你知道一种构造这个结构的方法吗?嗨,凯文,我把maxItemsInObjectGraph改成了maximun值。问题是异步调用导致的并行查询数呈指数增长。我已经用一个全局变量队列解决了这个问题。我要把项目转移到lightswitch。谢谢。