2017-01-16 2 views
0

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

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

погуглить код ошибки, это выглядит как тайм-аут истек, но для жизни меня я не могу понять, почему.

Сам код выполняется отлично, это только на выходе из main(), а не на бит, где REngine выпадает из области видимости, поэтому, возможно, в сборке мусора все идет не так?

+1

Просто выбросьте это; 'REngine' явно реализует' IDisposable'. Вся проблема может исчезнуть, если вместо использования переменной класса 'static' вы поместите ее в блок' using'. – CDove

+0

Я сделал это так, как только создаю этот класс несколько раз. Возможно, я должен создать REngine в классе вызывающего с «помощью» и послал его в через конструктор - даст гидромассажные – JetSetJim

+1

Если вы кладете '' using' внутри SHESD_Test', он будет создавать экземпляр, запускать все функции на нем, а затем утилизировать его каждый раз, когда вызывается 'SHESD_Test'. Если это не свинья памяти, что, вероятно, путь, и вы не должны будете проверить 'если (двигатель == 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 - возможно, оставляя вещи в ожидании чего-то, чего никогда не произойдет, и, таким образом, запускает это окно исключения таймаута.

Смежные вопросы