У меня есть небольшая программа в C#, который загружает библиотеку R.Net на аутсорсинг некоторых вычислений, которые я не могу сделать в C#, а именно библиотеке обнаружения аномалий Twitter. К сожалению, когда код заканчивает консольное окно, он работает в зависаниях. Если я запустил его в отладке, выполнение кода кажется ошибкой, поэтому я подозреваю, что это связано с очисткой REngine, поскольку я (в конечном итоге) получаю ошибку в соответствии с этим изображением.Проблем покидающих программ C#, который использует R.Net
После чего я получу еще один выскочит из 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 выпадает из области видимости, поэтому, возможно, в сборке мусора все идет не так?
Просто выбросьте это; 'REngine' явно реализует' IDisposable'. Вся проблема может исчезнуть, если вместо использования переменной класса 'static' вы поместите ее в блок' using'. – CDove
Я сделал это так, как только создаю этот класс несколько раз. Возможно, я должен создать REngine в классе вызывающего с «помощью» и послал его в через конструктор - даст гидромассажные – JetSetJim
Если вы кладете '' using' внутри SHESD_Test', он будет создавать экземпляр, запускать все функции на нем, а затем утилизировать его каждый раз, когда вызывается 'SHESD_Test'. Если это не свинья памяти, что, вероятно, путь, и вы не должны будете проверить 'если (двигатель == NULL)'» – CDove