arcgis engine释放资源
(2012-05-16 13:52:02)
标签:
杂谈 |
分类: arcengine |
ArcEngine 中存在一些错误。其中最有名的就是对象不能释放资源的问题。
比如打开了一个Shapefile ,除非程序关闭否则就没有办法释放对Shapefile的控制
还有读取ServerStyle文件的时候那个StyleItemEnum只能使用一次。第二次就会出错,
如果在短时间内搜索多个FeatureClass这样就会产生多个FeatureCursor,那么就会出现
打开的游标数目过多或者不能打开更多的表这样的错误。
这些错误都是由于对象不能释放资源所造成的。
可以使用以下方法来释放(C#):
//其中relObj就是要释放的对象。
System.Runtime.InteropServices.Marshal.ReleaseComObject(relObj);
如果要确保被释放了。那么可以循环调用该方法 直到这个方法返回0为止。
static public IRaster
ConvertToRaster(IFeatureLayer pFeatLayer, string field, object
cellSizeProvider)
{
IInterpolationOp pInterpolationOp = new
RasterInterpolationOpClass();
// Define
the search radius
IRasterRadius pRadius = new RasterRadiusClass();
object
Missing = Type.Missing;
pRadius.SetVariable(12, ref Missing);
//Create
FeatureClassDescriptor using a value field
IFeatureClassDescriptor pFCDescriptor = new
FeatureClassDescriptorClass();
pFCDescriptor.Create(pFeatLayer.FeatureClass, null, field);
IRasterAnalysisEnvironment pEnv = pInterpolationOp as
IRasterAnalysisEnvironment;
pEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref
cellSizeProvider);
//Perform
the interpolation 就是在这里渲染
IRaster
pOutRaster = pInterpolationOp.IDW(pFCDescriptor as IGeoDataset, 2,
pRadius, ref Missing) as IRaster;
return
pOutRaster;
}
IRaster pOutRaster =
pInterpolationOp.IDW(pFCDescriptor as IGeoDataset, 2, pRadius, ref
Missing) as IRaster;
static public IRaster
ConvertToRaster(IFeatureLayer pFeatLayer, string field, object
cellSizeProvider)
{
IInterpolationOp pInterpolationOp = new
RasterInterpolationOpClass();
// Define
the search radius
IRasterRadius pRadius = new RasterRadiusClass();
object
Missing = Type.Missing;
pRadius.SetVariable(12, ref Missing);
//Create
FeatureClassDescriptor using a value field
IFeatureClassDescriptor pFCDescriptor = new
FeatureClassDescriptorClass();
pFCDescriptor.Create(pFeatLayer.FeatureClass, null, field);
IRasterAnalysisEnvironment pEnv = pInterpolationOp as
IRasterAnalysisEnvironment;
pEnv.SetCellSize(esriRasterEnvSettingEnum.esriRasterEnvValue, ref
cellSizeProvider);
//Perform
the interpolation 就是在这里渲染
IRaster
pOutRaster = pInterpolationOp.IDW(pFCDescriptor as IGeoDataset, 2,
pRadius, ref Missing) as IRaster;
while(System.Runtime.InteropServices.Marshal.ReleaseComObject(pFCDescriptor)!=0)
{
}
while
(System.Runtime.InteropServices.Marshal.ReleaseComObject(pInterpolationOp)
!= 0)
{
}
//while
(System.Runtime.InteropServices.Marshal.ReleaseComObject(pEnv) !=
0)
//{
//}
return
pOutRaster;
}
比如打开了一个Shapefile ,除非程序关闭否则就没有办法释放对Shapefile的控制
还有读取ServerStyle文件的时候那个StyleItemEnum只能使用一次。第二次就会出错,
如果在短时间内搜索多个FeatureClass这样就会产生多个FeatureCursor,那么就会出现
打开的游标数目过多或者不能打开更多的表这样的错误。
这些错误都是由于对象不能释放资源所造成的。
可以使用以下方法来释放(C#):
//其中relObj就是要释放的对象。
System.Runtime.InteropServices.Marshal.ReleaseComObject(relObj);
如果要确保被释放了。那么可以循环调用该方法 直到这个方法返回0为止。
比如我写的一个函数,原来是这样:
当重复调用的时候,资源释放不了,在
抛出了不能转换的异常:
加上释放资源的代码,变成如下:
问题就解决了。这回到我之前类似的一个问题,是不是都是资源释放不了的原因?
前一篇:设备分类
后一篇:arcengine 点太少