GC收集仍然引用的对象

时间:2016-10-28 14:55:06

标签: vb.net excel-vba garbage-collection vba excel

我需要解决粒子中浓度的数学模型,而excel是参数的UI。

我在vb.net中创建了一个包含3个类的dll库:Particle,ParticleMix InteropParticleMix。

基于它的粒子的属性有一个sub,它通过一个简单的euler方法计算下一步的浓度。

ParticleMix是一个具有Particle字典的类,double表示混合物中每个粒子的质量分数,以及计算属性加权平均值的属性。

InteropParticleMix继承了ParticleMix,它在创建时创建3个粒子,将它们保存在3个字段上。在名为Load I的Sub中,在字典上添加3个粒子和相应的分数。最后但并非最不重要的是,一个函数循环n次通过一个简单的euler方法调用下一步,保存每个粒子的浓度和数组中的平均值。

现在来自VBA-excel我创建了一个新的InteropParticleMix,插入每个属性并调用存储在一个变量中的迭代方法。

数学和信息流的一切都很好,但有30%的时间返回值很疯狂。数组的第一个元素总是有效,但随机粒子随机点到6553500.我假设这是由于GC在迭代过程中收集了一个粒子引起的。此行为适用于相同的输入参数,因此它不是分歧或舍入问题。

在循环之前,之内和之后的每个粒子上都使用了GC.KeepAlive方法。有灯吗?

1 个答案:

答案 0 :(得分:0)

找到它。为了获得更好的性能,类中的一些属性使用parallel.foreach循环来计算Keys,weight的字典上的加权算术平均值。例如:

Public ReadOnly Property Test As Double
    Get
        Dim dblTest As Double = 1

        Parallel.ForEach(MassFractions.Keys, Sub(s)
                                                 dblTest += s.Test * MassFractions(s)
                                             End Sub)
        Return dblTest
    End Get
End Property

但由于某种原因,这会在事件侦听器和引用上导致一些意外行为。更改为非并行循环解决了该问题。解决的例子:

    Public ReadOnly Property Test As Double
    Get
        Dim dblTest As Double = 0

        For Each s As Substance In MassFractions.Keys
            dblTest += s.Test * MassFractions(s)
        Next

        Return dblTest
    End Get
End Property