2017-01-16 8 views
0

私はC#で行うことができない計算を外注するためにR.NetライブラリをロードするC#の小さなプログラム、つまりTwitter異常解析ライブラリを持っています。残念ながら、コードがコンソールウィンドウを終了すると、そのウィンドウはハングして実行されます。私はそれをデバッグで実行すると、コードの実行にエラーがないように見えるので、私は(最終的に)このイメージごとにエラーが出るので、REngineのクリーンアップと関係があると思われます。私は別の「デバッグの停止が、まだ完了していない、このいずれかのボタンを押して、停止または待機するように継続することを強制された」旨のVSからポップアップしますよこれ後R.Netを使用するC#プログラムを終了する際の問題

Error message thrown by VS Community 2015, Update 3

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

私はこのクラスを複数回作成するので、このようにしました。おそらく、呼び出すクラスでREngineを "using"で作成し、それをコンストラクタ経由で送信する必要があります。 – JetSetJim

+1

'SHESD_Test'の中に' using'を置くと、インスタンスが作成され、すべて実行されますSHESD_Testが呼び出されるたびにそれを破棄します。メモリホッグでない限り、これはおそらく行く方法です。 'if(engine == null)' 'のテストを行う必要はありません。 – CDove

答えて

0

さらに根本的な原因は、ライブラリ関数の中に、プロローグウィンドウを生成することです。彼らのコードは次のとおりです。

# 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! 
} 

私はエンジンで行われていたときに私のコードに次の行を追加:

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

はなることができるようには思えない奇妙な空のウィンドウを閉じ、 ForceGarbageCollectionメソッドまたはDisposeメソッドのいずれかによって閉じられます。これは決して起こらない何かを待つことを懸念し、このタイムアウト例外ウィンドウをトリガーします。