在我的应用程序的结构中,每个线程都创建了自己的 bigSlowObject
的实例化速度很慢。
编辑:这个对象来自于一个.dll,并且是密封的,不能修改。
然后,线程会设置一些属性(the bigSlowObjectID
和 hostName
属性)并提交它(这非常快),然后退出。 这个类看起来像这样。
public class bigSlowObject{
public guid bigSlowObjectID {get;set;}
public string hostName {get;set;}
public bigSlowObject(){
//build object, which is the slow part
}
}
为了改变两个字段而不断地newing基本相同的对象似乎效率很低。 为了解决这个问题,我试着让我的代码建立了一个初始的 bigSlowObject
在 Main()
方法,称为 baseBigSlowObject
. 然后,我让我的线程尝试着自己制作副本,以跳过那一大笔建造费用。
然而,我一直得到错误的 Object reference not set to an instance of an object
.
我试着像这样解箱对象,我以为这样会使我的线程将引用类型转换为值类型。
//within the thread
object myBigSlowObject = baseBigSlowObject;
但我还是遇到了同样的 object reference not set to an instance of an object
错误。
我是否需要做一些特殊的事情,以便每个线程都能安全地锁定几纳秒来制作自己的这个对象的副本,然后继续?
在一个理想的解决方案中,每个线程都会尝试在这个对象上获得一个锁。baseBigSlowObject
然后制作自己的副本继续进行。 如果需要的话,如果其他线程中有一个线程有锁的话,希望它能等待它兄弟的。
的属性(bigSlowObjectID和hostName ... Lazy<T>
类的目的就是为了这个目的。在一个实例准备好之前,你不能引用它,而且所有的调用者都会得到同一个实例。这应该是个好办法。
public static Lazy<bigSlowObject> theObject = new Lazy<bigSlowObject>();
引用对象,使用 Value
财产。
theObject.Value.bigSlowObjectId
只是一个想法,希望我说的对,会有帮助。
你有没有尝试克隆对象类?
public class bigSlowObject : ICloneable
{
public guid bigSlowObjectID {get;set;}
public string hostName {get;set;}
public bigSlowObject(){
//build object, which is the slow part
}
public object Clone()
{
return this.MemberwiseClone();
}
}
然后
bigSlowObject myObjectFromMainThread = new bigSlowObject();
bigSlowObject myObjectFromSecondThread = myObjectFromMainThread.Clone();