面向多线程的VB.Net类设计

面向多线程的VB.Net类设计,vb.net,multithreading,class,static,Vb.net,Multithreading,Class,Static,我将尝试在没有任何实际代码的情况下问几个设计问题,因为我必须临时编写代码,并且可能会出错 [底部的伪代码可能会有所帮助。] 我有一个完全用VBA编写的工具,使用Excel作为前端,我想将它的一部分移动到VB.Net以利用多线程。我想问的是类或方法声明(即静态/共享/单例)如何影响多线程性能 这里是我想要改进的瓶颈:在VBA中,我有一个包含我自己的DealObject实例的字典。我通过字典为每个对象创建了一个For/Each,并在每个DealObject中调用一个重估值方法。重估方法将DataOb

我将尝试在没有任何实际代码的情况下问几个设计问题,因为我必须临时编写代码,并且可能会出错

[底部的伪代码可能会有所帮助。]

我有一个完全用VBA编写的工具,使用Excel作为前端,我想将它的一部分移动到VB.Net以利用多线程。我想问的是类或方法声明(即静态/共享/单例)如何影响多线程性能

这里是我想要改进的瓶颈:在VBA中,我有一个包含我自己的DealObject实例的字典。我通过字典为每个对象创建了一个For/Each,并在每个DealObject中调用一个重估值方法。重估方法将DataObject作为参数,在每次交易中重复使用相同的实例。重估方法还在内部实例化PricerObject,在PricerObject中调用PricingFunction方法,将DataObject和DealObject本身作为参数传递。PrimeObjor方法将声明包括到C++ DLL中的函数。 简而言之,我现在试图改进的是将For/Each DealObject更改为Parallel.ForEach调用。我正在将DealObject、DataObject和PricerObject移动到VB.Net。并将新的多线程循环放入一个新的VB.net DealSetObject中,该对象包含一个deals字典和Parallel.ForEach循环

我的问题是,在没有看到代码的情况下,抱歉,它只是不存在,是否有任何明确的设计选择来优化多线程

估价函数基本上有DealObject+DataObject->PricingFunction->result的形式。让所有定价调用使用相同的DataObject实例是否会损害多线程优势?定价函数只调用DataObject中的只读属性是否有帮助

PricerObject应该是单身吗?或者,对于每个DealObjor都有好处,它可以用所有实例指向同一个C++ DLL来实例化自己的PrIGRealObjor?在每个循环迭代中,在DealObjects之外实例化PricerObjects会更好吗

请注意,在填充带有输入和处理的数据项目时会有大量开销。PricerObject在内部不保留任何数据

我怀疑我对设计的描述可能很难理解,也许一点伪代码会有所帮助。这个过程是:

Sub Main
DataObject = New
DealSetObject = New
Call GetMarketData(DataObject)
Call GetDeals(DealSetObject)
Call DealSetObject.RevalAllDeals(DataObject)    


DealSetObject:
Sub RevalAllDeals(DataObject)
    Parallel.ForEach DealObject in DealSetObject
       Call DealObject.Revalue(DataObject)
    Next


DealObject: 
Sub Revalue(DataObject)
   PricerObject = New
   Call PricerObject.PricingFunction(Me, DataObject)


PricerObject:
Private Declare C++ dll function
Function PricingFunction(DealObject, DataObject)
   [get stuff]
   Call C++Function(stuff)

这要看情况而定。C++函数线程安全且无阻塞吗?也就是说,您能否安全地一次多次调用此函数?PricigFunction听起来像一个助手方法。你可以考虑把它变成一个静态的方法或者一个单独的PrimeObjor对象,但是,我没有看到很好的理由。如何从DataObject获取数据?这是线程安全且无阻塞的吗?您是否检查了当前实现中的实际瓶颈?它是C++函数吗?或者别的什么?如果你这个项目的全部目的只是为了加速现有的项目。。。您是否考虑过完全重写您的文档可能是完全不必要的。谢谢您的评论。关于检查瓶颈和检查代码,我现在的假设是,如果我理解正确,VBA不支持任何多线程,并且VB.Net可以实现多线程?!,在8核机器上vb.net中的Parallel.ForEach应该快得多。我重点关注的问题是,在VBA中,按顺序为每个交易估价10000笔交易所需的时间。我的假设是多线程必须更好地质疑吗?在内部,C++函数是用多线程编写的。dll如何与并行调用交互,我对如何检查、如何控制或编辑它一无所知。通常C++在每个函数调用中运行PDEs的数值方法,然后你必须找出C++函数是否是线程安全的。您可以通过一次运行多个实例来测试它,但除非答案是“否”,否则不会给出特定的答案。如果您有它的源代码,您可以分析它。如果没有,您必须询问开发人员。并行化一个非线程安全的函数是没有意义的。您必须引入可能会很快变慢的锁