在C#中,如何将一个资源的值拷贝交给我的线程使用。

问题描述 投票:0回答:1

在我的应用程序的结构中,每个线程都创建了自己的 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基本相同的对象似乎效率很低。 为了解决这个问题,我试着让我的代码建立了一个初始的 bigSlowObjectMain() 方法,称为 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 然后制作自己的副本继续进行。 如果需要的话,如果其他线程中有一个线程有锁的话,希望它能等待它兄弟的。

c# multithreading
1个回答
1
投票

的属性(bigSlowObjectID和hostName ... Lazy<T> 类的目的就是为了这个目的。在一个实例准备好之前,你不能引用它,而且所有的调用者都会得到同一个实例。这应该是个好办法。

    public static Lazy<bigSlowObject> theObject = new Lazy<bigSlowObject>();

引用对象,使用 Value 财产。

    theObject.Value.bigSlowObjectId

1
投票

只是一个想法,希望我说的对,会有帮助。

你有没有尝试克隆对象类?

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();
© www.soinside.com 2019 - 2024. All rights reserved.