¿Debo disponer estos objetos SPSIT y SPWEB?
Pregunta
¿Es necesario deshacerse del sitio y los objetos web en el siguiente código? Si es así, ¿cómo hago esto?
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Dim site As New SPSite(SPContext.Current.Web.Url)
Dim web As SPWeb = site.OpenWeb()
web.AllowUnsafeUpdates = True
Dim lPmr As SPList = web.Lists("NombreList")
Dim oQuery As New SPQuery()
Dim itemCollectionPMR As SPListItemCollection
oQuery = New SPQuery()
oQuery.Query = ""
itemCollectionPMR = lPmr.GetItems(oQuery)
........
End Sub
Solución
James y Toni son absolutamente correctos, pero se han perdido el en mi humilde opinión: su código tiene un defecto más profundo y si arreglas esto, no es necesario eliminar los objetos.
Debería (cuando sea posible) usar los objetos SPWEB y SPSITE de SPContext: ya los crean para usted la infraestructura de la parte web de SharePoint y es más eficiente usarlos que crear el suyo.
En su código, ya está utilizando uno de ellos para obtener la URL de las redes actuales, pero luego creando su propio sitio y web independientemente, bastante ineficiente y no es necesario.
Entonces en lugar de
Dim site As New SPSite(SPContext.Current.Web.Url)
Dim web As SPWeb = site.OpenWeb()
Deberías estar usando solo
Dim web As SPWeb = SPContext.Current.Web
Si usa SPSITE/SPWEB de SpContext estos en lugar de crear el suyo propio, entonces no debe deshacerse de ellos (no los creó, así que déjalos solo)
Ver MSDN - Mejores prácticas: Uso de objetos desechables de Windows SharePoint Services
Los objetos SPContext son administrados por el marco de SharePoint y no deben estar explícitamente dispuestos en su código. Esto también es cierto para los objetos SPSITE y SPWEB devueltos por SpContext.Site, SpContext.Current.Site, SpContext.Web y SpContext.Current.Web.
Otros consejos
Sí, deberá deshacerse de los spwebs creados a través de spsite.openweb ().
Para deshacerse de él, Call Simple Web.Dispose () cuando haya terminado en el método.
También puede usar la declaración de uso del mismo efecto, sin necesidad de llamar directamente a la eliminación ()
Using site As New SPSite(SPContext.Current.Web.Url)
Using web As SPWeb = site.OpenWeb()
web.AllowUnsafeUpdates = True
Dim lPmr As SPList = web.Lists("NombreList")
Dim oQuery As New SPQuery()
Dim itemCollectionPMR As SPListItemCollection
oQuery = New SPQuery()
oQuery.Query = ""
itemCollectionPMR = lPmr.GetItems(oQuery)
End Using
End Using
+1 James
También deberías intentar usar Herramienta de verificador de disposición de SharePoint en sus proyectos para analizar su código para obtener posibles fugas de memoria y aplicar las mejores prácticas.