Я недавно пытался использовать R.NET , чтобы заставить R говорить с .NET и C #.Пока все шло очень хорошо, но я наткнулся на загадку, которую, похоже, не могу решить.
У меня не было проблем с простыми базовыми командами.Я сделал простой калькулятор и кое-что для импорта данных в сетку данных.Но теперь я продолжаю получать следующую ошибку:
Был выполнен обратный вызов делегата со сборкой мусора типа 'R.NET! RDotNet.Internals.blah3 :: Invoke'.Это может вызвать сбои приложения, повреждение и потерю данных.При передаче делегатов в неуправляемый код управляемое приложение должно поддерживать их работу до тех пор, пока не будет гарантировано, что они никогда не будут вызваны.
Это началось, когда я пытался повторно импортировать текстовый файл, просто чтобыпроверить что-нибудь.Я искал эту ошибку по-разному - после нескольких часов пролистывания страниц кажется, что существует ряд причин такого типа ошибок.С течением времени я стал разбирать свой код на все более и более простые задачи, чтобы попытаться устранить возможности.Я получил это сейчас:
public Form1()
{
InitializeComponent();
REngine.SetDllDirectory(@"C:\Program Files\R\R-2.13.0\bin\i386");
REngine.CreateInstance("RDotNet");
using (REngine currentEngine = REngine.GetInstanceFromID("RDotNet"))
{
for (int i = 0; i < 1000; ++i)
{
currentEngine.EagerEvaluate("test <- " + i.ToString());
NumericVector returned = currentEngine.GetSymbol("test").AsNumeric();
textBox1.Text += returned[0];
}
}
}
Все, что он делает, это увеличивает счетчик в textBox1.Text.Я делал это как тест с нажатием кнопки, увеличивающей значение, но через некоторое время у меня болел палец!Как правило, он может управлять нагрузками, прежде чем выдает ошибку выше.
Сначала этот код казался нормальным - поэтому я предположил, что другие вещи, которые я делал, были как-то причиной проблемы, а такжепричина ошибки указана выше.Вот почему я включил цикл for.Цикл может работать без проблем в течение нескольких сотен запусков, но затем появляется ошибка.
Теперь я прочитал, что этот тип ошибки может быть вызван сборщиком мусора, избавляющимся от экземпляра, который яработал с.Я пробовал различные предложения, которые я прочитал, так как я их лучше понимаю.К ним относится использование GC.KeepAlive () (не повезло), а также создание частного поля в отдельном классе, от которого невозможно избавиться.К сожалению, это тоже не сработало.
Есть что-нибудь еще, что я могу попробовать?Я очень, очень плохо знаком с C #, поэтому я был бы признателен за любые советы о том, как заставить это работать.Я очень полагаю, что мое отсутствие успеха с предложенными методами связано либо с (1) моими собственными ошибками в реализации стандартных исправлений (это кажется наиболее вероятным), либо (2) с причудой, связанной с R.NET, которая у меня есть.Не поняли.
Любая помощь будет принята с благодарностью!