重复创建内存工作空间 ,系统内存上升很快,调用Marshal.ReleaseComObject释放AE对象 并没有起作用,请问如何正确的释放所有的AE对象?

static void Main(string[] args)
{
for (int i = 0; i < 100; i++)
{
CreateMemoryFeatureClass(i);

}
}

public static void CreateMemoryFeatureClass(int n)
{
IWorkspaceFactory pWSF = (IWorkspaceFactory)new InMemoryWorkspaceFactory();
IFeatureClass pFeatureClass = null; ;

IWorkspaceName workName = pWSF.Create("", "test"+n, null, 0);
IName name = workName as IName;
IWorkspace workspace = name.Open() as IWorkspace;

// ------------------------------
IFields pFields = new Fields();
IFieldsEdit pFieldsEdit;
pFieldsEdit = (IFieldsEdit)pFields;

IField pField22 = new Field();
IFieldEdit pFieldEdit22 = (IFieldEdit)pField22;
pFieldEdit22.Name_2 = "OBJECTID";
//设置字段类型
pFieldEdit22.Type_2 = esriFieldType.esriFieldTypeOID;
pFieldsEdit.AddField(pField22);


IField pField = new Field();
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "Shape";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;

IGeometryDef pGeometryDef = new GeometryDef();
IGeometryDefEdit pGDefEdit = (IGeometryDefEdit)pGeometryDef;
pGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
//定义坐标系
ISpatialReferenceFactory pSRF = new SpatialReferenceEnvironment();
ISpatialReference pSpatialReference = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
pGDefEdit.SpatialReference_2 = pSpatialReference;
pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldsEdit.AddField(pField);

IField pField33 = new Field();
pFieldEdit = (IFieldEdit)pField33;
pFieldEdit.Name_2 = "CO2";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
pFieldsEdit.AddField(pField33);
//-------------------------------

pFeatureClass = (workspace as IFeatureWorkspace).CreateFeatureClass( "testClass"+n, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");

////插入数据
IFeatureCursor pFeatureCursor = null;
IFeatureBuffer pFeatureBuffer = null;
int k = 0;
IPoint pPoint = new ESRI.ArcGIS.Geometry.Point();
try
{
for (int i = 1; i < 40; i++)
{
for (int j = 0; j < 50; j++)
{
pPoint.Y = i;
pPoint.X = j ;
pFeatureCursor = pFeatureClass.Insert(true);
pFeatureBuffer = pFeatureClass.CreateFeatureBuffer();
pFeatureBuffer.Shape = pPoint;
pFeatureBuffer.set_Value(2, i*j);
//保存
pFeatureCursor.InsertFeature(pFeatureBuffer);
k++;
if (k % 1000 == 0)
{
pFeatureCursor.Flush();
}
}
}
pFeatureCursor.Flush();
}
catch (Exception ex)
{

Console.WriteLine(ex.Message);
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFields);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFieldsEdit);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workName);
System.Runtime.InteropServices.Marshal.ReleaseComObject(name);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pWSF);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workName);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workspace);
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureClass);


}
已邀请:

朱新颖

赞同来自: 李金星

1,建议使用Marshal.FinalReleaseComObject释放,比ReleaseComObject释放的彻底
2,pFeatureCursor,IFeatureBuffer 也是要释放的

石羽

赞同来自: 李金星

最重要的FeatureCursor和FeatureBuffer没释放,释放的都是些可有可无的。

要回复问题请先登录注册