私はC#で行うことができない計算を外注するためにR.NetライブラリをロードするC#の小さなプログラム、つまりTwitter異常解析ライブラリを持っています。残念ながら、コードがコンソールウィンドウを終了すると、そのウィンドウはハングして実行されます。私はそれをデバッグで実行すると、コードの実行にエラーがないように見えるので、私は(最終的に)このイメージごとにエラーが出るので、REngineのクリーンアップと関係があると思われます。私は別の「デバッグの停止が、まだ完了していない、このいずれかのボタンを押して、停止または待機するように継続することを強制された」旨のVSからポップアップしますよこれ後R.Netを使用するC#プログラムを終了する際の問題
。
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
私はこのクラスを複数回作成するので、このようにしました。おそらく、呼び出すクラスでREngineを "using"で作成し、それをコンストラクタ経由で送信する必要があります。 – JetSetJim
'SHESD_Test'の中に' using'を置くと、インスタンスが作成され、すべて実行されますSHESD_Testが呼び出されるたびにそれを破棄します。メモリホッグでない限り、これはおそらく行く方法です。 'if(engine == null)' 'のテストを行う必要はありません。 – CDove