Проблемы с выходом из программы на C#, использующей R.Net

У меня есть небольшая программа на C#, которая загружает библиотеку R.Net для передачи некоторых вычислений, которые я не могу сделать в C#, а именно библиотека обнаружения аномалий в Twitter. К сожалению, когда код заканчивает консольное окно, оно запускается с зависаниями. Если я запускаю его в режиме отладки, выполнение кода кажется безошибочным, поэтому я подозреваю, что это как-то связано с очисткой REngine, так как я (в конце концов) получаю ошибку в соответствии с этим образом.

Сообщение об ошибке, сгенерированное VS Community 2015, обновление 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 ответ

Решение

Продолжая копаться, основная причина кроется в библиотечной функции, которая генерирует окно графика в своем возвращаемом значении, даже если сказано, что нет. Их код:

# 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 - возможно, оставляя вещи в ожидании чего-то, что никогда не произойдет, и, таким образом, запускает это окно исключения тайм-аута.

Другие вопросы по тегам