我需要解决粒子中浓度的数学模型,而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方法。有灯吗?
答案 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