Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,如何将资源的值副本交给我的线程使用_C#_Multithreading - Fatal编程技术网

在C#中,如何将资源的值副本交给我的线程使用

在C#中,如何将资源的值副本交给我的线程使用,c#,multithreading,C#,Multithreading,在我的应用程序的结构中,每个线程都会创建自己的bigSlowObject实例,但实例化速度很慢 编辑:此对象来自.dll,已密封,无法修改 然后线程设置一些属性(bigSlowObjectID和hostName属性)并提交它(非常快),然后退出。这个班看起来像这样 public class bigSlowObject{ public guid bigSlowObjectID {get;set;} public string hostName {get;set;}

在我的应用程序的结构中,每个线程都会创建自己的
bigSlowObject
实例,但实例化速度很慢

编辑:此对象来自.dll,已密封,无法修改

然后线程设置一些属性(
bigSlowObjectID
hostName
属性)并提交它(非常快),然后退出。这个班看起来像这样

public class bigSlowObject{

    public guid bigSlowObjectID {get;set;} 
    public string hostName {get;set;}     
    
    public bigSlowObject(){
        //build object, which is the slow part
    }
}
仅仅为了更改两个字段而不断更新基本相同的对象似乎效率低下。为了解决这个问题,我尝试让我的代码在
Main()
方法中构建一个名为
baseBigSlowObject
bigslobject
的初始实例。然后,我让我的线程尝试自己复制它,以跳过庞大的构建成本

但是,我不断收到未设置为对象实例的
对象引用的错误

我尝试像这样取消绑定对象,我认为这会使我的线程将引用类型转换为值类型:

//within the thread
object myBigSlowObject = baseBigSlowObject;
但我仍然遇到相同的
对象引用未设置为对象实例的错误

我是否需要做一些特殊的事情,以便每个线程可以安全地锁定几纳秒,以创建自己的对象副本,然后继续

在理想的解决方案中,每个线程都会尝试锁定
baseBigSlowObject
,然后创建自己的副本以继续。如果其他线程中有一个线程有锁,那么它希望在需要时等待它的兄弟线程。

Lazy
类就是为了这个目的而设计的。在实例准备就绪并且所有调用方都获得相同的实例之前,您将无法引用该实例。这应该可以做到:

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

Lazy
类就是为了这个目的而设计的。在实例准备就绪并且所有调用方都获得相同的实例之前,您将无法引用该实例。这应该可以做到:

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


只是想一想,希望我能帮到你:

您是否尝试克隆对象类

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();

只是想一想,希望我能帮到你:

您是否尝试克隆对象类

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();

“创建副本”是什么意思?此语句:
objectmybigslowobject=baseBigSlowObject简单地分配一个引用,使它们指向同一个对象,并且这里没有复制(或者更准确地说,只有地址被复制)。关于NPE(对象引用未设置为对象的实例),通过这里展示的少量代码,这确实很难说,但我认为您的
baseBigSlowObject
为空,因此对它的引用引发此异常。我还建议您看看
对象池
,它似乎非常适合您的问题。我们的想法是,在开始创建对象时,您需要创建一些这样昂贵的类,并继续重用它们。如果问题出在
bigSlowObject
的构造函数上,为什么不将构造函数的结果存储在类或结构中?然后,您可以让每个新的
bigSlowObject
访问该数据结构,而不是让每个人都运行昂贵的构造函数。我使用的类来自我无法修改的第三方DLL,它做了一些内部的好事,速度很慢@patricktucci“创建副本”是什么意思?此语句:
objectmybigslowobject=baseBigSlowObject简单地分配一个引用,使它们指向同一个对象,并且这里没有复制(或者更准确地说,只有地址被复制)。关于NPE(对象引用未设置为对象的实例),通过这里展示的少量代码,这确实很难说,但我认为您的
baseBigSlowObject
为空,因此对它的引用引发此异常。我还建议您看看
对象池
,它似乎非常适合您的问题。我们的想法是,在开始创建对象时,您需要创建一些这样昂贵的类,并继续重用它们。如果问题出在
bigSlowObject
的构造函数上,为什么不将构造函数的结果存储在类或结构中?然后,你可以给每个新的
bigSlowObject
访问该数据结构,而不是让每个人都运行昂贵的构造函数。我使用的类来自第三方DLL,我无法修改,它有一些内部优点,速度很慢@patricktucci这看起来很有希望,但我无法编辑基类。我将其编辑到我的问题中。懒惰的单例不需要在基类中,它可以是任何类的公共静态成员。第一次访问
Value
属性时,将触发
bigSlowObject
实例的构造。这看起来很有希望,但我无法编辑基类。我将其编辑到我的问题中。懒惰的单例不需要在基类中,它可以是任何类的公共静态成员。第一次访问
Value
属性时将触发
bigSlowObject
实例的构造。这看起来很有希望,但我无法编辑密封的基类。这看起来很有希望,但我无法编辑密封的基类。