2017-01-16 3 views
0

C#에서 수행 할 수없는 계산, 즉 Twitter 이상 검색 라이브러리를 아웃소싱하기 위해 R.Net 라이브러리를로드하는 C#의 작은 프로그램이 있습니다. 불행하게도, 코드가 콘솔 창을 끝내면 코드가 실행될 수 있습니다. 디버그에서 실행하면 코드 실행이 오류가있는 것처럼 보이므로이 이미지별로 오류가 발생하여 결국 REngine 정리 작업과 관련이 있다고 판단됩니다.R.Net을 사용하는 C# 프로그램을 종료 할 때의 문제

Error message thrown by VS Community 2015, Update 3

후 나는 또 다른 진술 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이 범위를 벗어나는 비트가 아니므로 가비지 수집에서 문제가 발생할 수 있습니다.

+1

그냥 던지십시오. 'REngine'은'IDisposable'을 명확하게 구현합니다. 'static' 클래스 변수를 사용하는 대신'using' 블록에 넣으면 모든 문제를 해결할 수 있습니다. – CDove

+0

나는이 클래스를 여러 번 만들 때 이렇게했다. 아마도 나는 호출 클래스에서 "using"을 사용하여 REngine을 생성하고 생성자를 통해 전송해야합니다. - whirl을 줄 것입니다. – JetSetJim

+1

'SHESD_Test' 안에'using'을 넣으면 인스턴스를 생성하고 모두 실행합니다. 함수를 호출하고,'SHESD_Test'가 호출 될 때마다 처리합니다. 메모리 호그가 아니라면 아마도 그럴 것입니다.'if (engine == null)'에 대해서 테스트 할 필요가 없습니다. – CDove

답변

0

더 자세히 살펴보면 근본 원인은 라이브러리 함수에있어 반환하지 않는 경우에도 반환 값에 플롯 창이 생성됩니다. 그들의 코드는 다음과 같습니다

engine.Evaluate("graphics.off()"); 

가 이상한 빈 창을 닫 될 수있을 것 같지 않습니다 : 내가 엔진으로 수행하고있을 때

# Lastly, return anoms and optionally the plot if requested by the user 
if(plot){ 
    return (list(anoms = anoms, plot = xgraph)) 
} else { 
    return (list(anoms = anoms, ***plot = plot.new()***)) # <-Looky here! 
} 

내 코드에 다음 줄을 추가 ForceGarbageCollection 또는 Dispose 메서드 중 하나에 의해 닫 혔습니다. 발생하지 않을 물건을 기다리는 것에 매달려서이 제한 시간 예외 윈도우를 트리거합니다.