WSS中,微软提供了一整套完成的接口,使开发者可以通过这些接口对WSS中数据进行读写,那么,在编写代码过程中需要注意哪些问题呢?如何解决这些问题?
WSS对象模型包含对象都实现了IDisposable接口,所以必须注意尽量避免在内存中保留没用的对象。实际上,如果没有及时清除内存中没用的对象,可以能出现一些问题。
比如,WSS应用程序池经常性回收,应用程序出现堆栈错误,系统性能下降等等。那么如何防止这些问题发生,我们需要在代码中注意一些事项:
1. 使用Dispose方法来清除没用的对象
在WSS对象模型中,主要影响性能的类有SPSite类和SPWeb类,建议在使用完这些类后使用Dispose方法清空对象。这些内存中的对象在长时间没有使用的情况下,.net垃圾回收机制进行清理,但是,千万不要太过相信垃圾回收机制,可能在它回收这些对象之前,你的机器已经崩溃。。
2. 使用using语句
通过using语句,可以在对象不在使用范围内自动清空,这样防止忘记调用dispose方法。如:
using(SPSite oSPsite = new SPSite("http://server"))
{
using(SPWeb oSPWeb = oSPSite.OpenWeb())
{
str = oSPWeb.Title;
str = oSPWeb.Url;
}
}
3. 利用try,catch和finally代码块防止程序出错后对象遗留在内存中。
String str;
SPSite oSPSite = null;
SPWeb oSPWeb = null;
try
{
oSPSite = new SPSite("http://server");
oSPWeb = oSPSite.OpenWeb(..);
str = oSPWeb.Title;
}
catch(Exception e)
{
}
finally
{
//当程序出错后,会调用这里的代码清除对象
if (oSPWeb != null)
oSPWeb.Dispose();
if (oSPSite != null)
oSPSite.Dispose();
}
注意,在使用重定向后,将不会调用finally中的代码,所以,如果要使用重定向,你应该使用如下代码:
String str;
SPSite oSPSite = null;
SPWeb oSPWeb = null;
try
{
oSPSite = new SPSite("http://server");
oSPWeb = oSPSite.OpenWeb(..);
str = oSPWeb.Title;
if(bDoRedirection)
{
//在重定向之前,清空相关对象
if (oSPWeb != null)
oSPWeb.Dispose();
if (oSPSite != null)
oSPSite.Dispose();
Response.Redirect("newpage.aspx");
}
}
catch(Exception e)
{
}
finally
{
if (oSPWeb != null)
oSPWeb.Dispose();
if (oSPSite != null)
oSPSite.Dispose();
}
4. 除了SPSite和SPWeb两个对象类以外,要注意的是,当你访问SPSite.RootWeb和SPWeb.ParentWeb 这两个属性后,你需要清除RootWeb产生的对象。例如:
String str;
SPSite oSPSite = new SPSite("http://server");
str = oSPSite.RootWeb.Title;
str = oSPSite.RootWeb.Url;
... additional processing on RootWeb ...
oSPSite.RootWeb.Dispose(); //注意要删除RootWeb产生的对象
oSPSite.Dispose();
在开发过程中,这些代码编写的细节往往会影响整个系统性能,所有在学习开发时就要养成良好的代码规范。。
作者:moss.net 出处:微软Core IO中文论坛
相关文章
同类最新