正在停止非托管委托的垃圾回收

本文关键字: | 更新日期: 2023-09-27 18:00:20

我最近一直在尝试使用R.NET让R与之交谈。NET和C#。到目前为止进展顺利,但我遇到了一个似乎无法解决的障碍。

我对简单、基本的命令没有任何问题。我做了一个简单的计算器,以及一些将数据导入数据网格的东西。但现在我不断得到以下错误:

对类型为"R"的垃圾回收委托进行了回调。NET!RDotNet。Internal.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相关的怪癖。

如有任何帮助,我们将不胜感激!

正在停止非托管委托的垃圾回收

看起来像是R.NET中的一个错误。NET层将回调传递给非托管代码,但随后让委托进行垃圾收集。我在您的repro代码中没有看到委托使用,因此得出结论,它必须在R.NET.

正如Stephen所建议的,事实证明这是我正在使用的R.NET版本中的一个错误,而不是我正在做的事情中的错误(这是我最初的猜测,因此我在这里发帖!)。R.NET的作者已经在R.NET论坛上回复了我的帖子,幸运的是,他已经解决了这个问题并更新了R.NET,尽管还没有以dll的形式(导入源文件很容易)。

我可以确认,最新版本的源文件实际上没有遇到这个问题。好哇!感谢所有在这里回复的人。不幸的是,我花了这么长时间为一个简单的错误挠头,但这对了解更多的C#/很有帮助。NET的东西,而我正在寻找解决方案。

相关文章:
  • 没有找到相关文章