退出使用R.Net的C#程序的问题

时间:2017-01-16 14:11:17

标签: c# visual-studio r.net

我在C#中有一个小程序,它加载R.Net库来外包我在c#中无法做的一些计算,即Twitter异常检测库。不幸的是,当代码完成控制台窗口时,它会挂起。如果我在调试中运行它,代码执行似乎没有错误,所以我怀疑它与清理REngine有关,因为我(最终)根据此图像得到错误。

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;
    }
}

Google搜索错误代码,看起来超时已过期,但对于我的生活,我无法弄清楚原因。

代码本身执行正常,它只在main()的退出中,而不是REngine超出范围的位,所以在垃圾收集中可能会出错吗?

1 个答案:

答案 0 :(得分: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方法关闭 - 可能会让事情悬而未决,等待一些永远不会发生的事情,从而触发这个超时异常窗口。 / p>