退出使用 R.Net 的 C# 程序时出现问题
Problems exiting C# program that uses R.Net
我有一个 C# 小程序加载 R.Net 库来外包一些我在 C# 中无法完成的计算,即 Twitter 异常检测库。不幸的是,当代码完成控制台 window 它 运行 挂起。如果我 运行 它处于调试状态,代码执行似乎没有错误,所以我怀疑这与 REngine 的清理有关,因为我(最终)按照这张图片得到一个错误。
之后我会从 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 超出范围的地方,所以也许在垃圾收集中出了问题?
进一步挖掘,根本原因在于库函数在其 return 值中生成图 window,即使被告知不要这样做。他们的代码是:
# 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()");
关闭奇怪的空 window,它似乎无法通过 ForceGarbageCollection 或 Dispose 方法关闭 - 可能让事情悬而未决,等待永远不会发生的事情,从而触发这个超时异常 window.
我有一个 C# 小程序加载 R.Net 库来外包一些我在 C# 中无法完成的计算,即 Twitter 异常检测库。不幸的是,当代码完成控制台 window 它 运行 挂起。如果我 运行 它处于调试状态,代码执行似乎没有错误,所以我怀疑这与 REngine 的清理有关,因为我(最终)按照这张图片得到一个错误。
之后我会从 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 超出范围的地方,所以也许在垃圾收集中出了问题?
进一步挖掘,根本原因在于库函数在其 return 值中生成图 window,即使被告知不要这样做。他们的代码是:
# 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()");
关闭奇怪的空 window,它似乎无法通过 ForceGarbageCollection 或 Dispose 方法关闭 - 可能让事情悬而未决,等待永远不会发生的事情,从而触发这个超时异常 window.