.NET+AE 개발에서 흔히 볼 수 있는 몇 가지 비위탁 관리 대상의 방출
왜 이런 상황이 생겼을까?문제는 비위탁 관리 자원(파일 핸들)이나 특별한 보살핌이 필요한 대상(Bitmap) 대상 등에 대해 GC가 다소 엇갈리는 모습을 보이고 있다는 점이다. (이 말은 정확하지 않을 수도 있다. 마이크로소프트가 GC를 디자인한 본뜻은 위탁 관리 대상을 대상으로 관리하는 것이기 때문이다).GC를 어떻게 효과적으로 이용하여 메모리 관리를 하고 프로그램의 성능을 최적화하는지는 본고에서 논의한 범위가 아니다.본고의 요지는 AE 개발에서 어떻게 비위탁 관리 대상을 방출하는가에 있다.
하나AOUninitialize.Shutdown.
AE 프로그램을 종료하는 동안 "The instruction x references memory at x. The memory could not be read"라는 오류가 자주 발생합니다.이러한 오류가 발생한 원인은 주로 COM 대상(비위탁 관리 대상)이 방출되지 않았기 때문이다. 우리가 프로세스를 사용했을 때 정상적으로 방출되는 것을 막는다. COM 대상의 방출 우선순위는 현재 사용한 프로세스의 방출 우선순위보다 높다. 즉, 프로세스가 방출되기 전에 반드시 방출해야 한다.
위의 원리를 이해하면 이 문제를 해결하는 방법은 매우 간단하다. 우리는 프로그램이 종료되기 전에 ESRI를 호출하기만 하면 된다.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown () 방법은 비위탁 관리 대상을 방출할 수 있습니다. (9.2 이전 버전의 AoUnininitialize는 ESRI.ArcGIS.ADF.COMsupport 명칭 공간에 있지 않습니다. 주의해야 합니다.)
2. Marshal.ReleaseComObject
NET 개발에서 COM 대상을 인용하는 것은 주로 RCW(Runtime Callable Wrappers) 메커니즘을 통해 이루어진다(약간 프록시 모델과 유사하다).COM 대상의 방출에 대해 GC는 약간 무력하게 행동하기 때문에 반드시 프로그램에서 COM 대상이 차지하는 자원을 방출해야 한다. 그렇지 않으면 예상치 못한 오류가 발생할 수 있다.예를 들어 Personal GeoDataBase에서 GeoDataBase Cursors를 반복적으로 열었는데 제때에 풀리지 않으면 "No more tables can be opened"를 일으킬 수 있습니다.다른 경우, 프로그램이 종료될 때, COM 대상이 메모리에서 인용되는 것을 발견할 수 있습니다.예를 들어 StyleGallery가 해제를 표시하지 않으면 프로그램이 종료될 때 오류가 발생합니다.
1、Releasing StyleGallery:
private void
MyFunction()
{
IStyleGallery styCls = new
StyleGalleryClass() as
IStyleGallery;
// Use the StyleGalleryClass here ...
int
refsLeft = 0;
do
{
refsLeft = Marshal.ReleaseComObject(styCls);
}
while
(refsLeft > 0);
}
2、Releasing geodatabase cursors
for
( int
i = 1; i < 2500; i++)
{
IQueryFilter qu = New QueryFilterClass();
qu.WhereClause = @"Area = " + i.ToString();
IFeatureCursor featCursor = featClass.Search(qu, true
);
// Use the feature cursor as required
System.Runtime.InteropServices.Marshal.ReleaseComObject(featCursor);
}
3、Releasing WebObject(ArcGIS Server)
private void
doSomthing_Click(object
sender, System.EventArgs e)
{
using
(WebObject webobj = new
WebObject())
{
ServerConnection serverConn = new
ServerConnection("doug", true
);
IServerObjectManager som = serverConn.ServerObjectManager;
IServerContext ctx = som.CreateServerContext("Yellowstone","MapServer");
IMapServer mapsrv = ctx.ServerObject as
IMapServer;
IMapServerObjects mapo = mapsrv as
IMapServerObjects;
IMap map = mapo.get_Map(mapsrv.DefaultMapName);
IFeatureLayer flayer = map.get_Layer(0) as
IFeatureLayer;
IFeatureClass fclass = flayer.FeatureClass;
IFeatureCursor fcursor = fclass.Search(null
, true
);
webobj.ManageLifetime(fcursor);
IFeature f = null;
while
((f = fcursor.NextFeature()) != null
)
{
// do something with the feature
}
ctx.ReleaseContext();
}
}
、 ?
, , System.Runtime.InteropServices.Marshal.ReleaseComObject() , 。
: AE , 。 , ArcGIS Engine 。
:
2、 ArcGIS Engine
:http://www.cnblogs.com/3echo/archive/2008/04/20/1162304.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HTTP Request in TCP파이썬으로 개발된 OCR 서버와 TCP로 이미지 데이터를 http 형식으로 전송하는 방법을 알아내기 위해, Node.js 의 내장 모듈 을 사용했다. 설명 http는 Content-Type에 따라 Body의 구조가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.