C#에서 수행 할 수없는 계산, 즉 Twitter 이상 검색 라이브러리를 아웃소싱하기 위해 R.Net 라이브러리를로드하는 C#의 작은 프로그램이 있습니다. 불행하게도, 코드가 콘솔 창을 끝내면 코드가 실행될 수 있습니다. 디버그에서 실행하면 코드 실행이 오류가있는 것처럼 보이므로이 이미지별로 오류가 발생하여 결국 REngine 정리 작업과 관련이 있다고 판단됩니다.R.Net을 사용하는 C# 프로그램을 종료 할 때의 문제
후 나는 또 다른 진술 VS에서 팝업 얻을 "디버깅을 중지하지만, 아직 완료되지이다, 중이 버튼을 눌러 중지하거나 기다릴 계속을 강제로"있습니다.
class SHESD_Test
{
private static REngine engine;
internal SHESD_Test(IEnumerable<Double> d)
{
try
{
if(engine==null)
{
engine = REngine.GetInstance();
engine.Initialize();
engine.Evaluate("library(AnomalyDetection)"); //Loads Twitter library
}
var dInR = engine.CreateNumericVector(d.toArray());
engine.SetSymbol("data", dInR);
var outVar = engine.Evaluate("outVar <- AnomalyDetectionVec(data, max_anoms=0.02, direction='both', plot=FALSE, period=96)");
/* Some other stuff that grabs data out of outVar in R and stores in member variables */
}
catch (Exception e)
{ /* Log error */ }
}
//Called from elsewhere once everything is complete, but behaviour is the same if I don't call it
internal static void cleanup()
{
engine.ForceGarbageCollection();
engine.Dispose();
engine == null;
}
}
오류 코드를 인터넷 검색는 제한 시간이 만료 된 것처럼 보이지만, 내 인생 그 이유를 알아낼 수 없습니다, 다음과 같이
코드는 약입니다.
코드 자체가 정상적으로 실행됩니다. 즉, main()의 출구에서만 작동하며 REngine이 범위를 벗어나는 비트가 아니므로 가비지 수집에서 문제가 발생할 수 있습니다.
그냥 던지십시오. 'REngine'은'IDisposable'을 명확하게 구현합니다. 'static' 클래스 변수를 사용하는 대신'using' 블록에 넣으면 모든 문제를 해결할 수 있습니다. – CDove
나는이 클래스를 여러 번 만들 때 이렇게했다. 아마도 나는 호출 클래스에서 "using"을 사용하여 REngine을 생성하고 생성자를 통해 전송해야합니다. - whirl을 줄 것입니다. – JetSetJim
'SHESD_Test' 안에'using'을 넣으면 인스턴스를 생성하고 모두 실행합니다. 함수를 호출하고,'SHESD_Test'가 호출 될 때마다 처리합니다. 메모리 호그가 아니라면 아마도 그럴 것입니다.'if (engine == null)'에 대해서 테스트 할 필요가 없습니다. – CDove