在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
实例的构造。这看起来很有希望,但我无法编辑密封的基类。这看起来很有希望,但我无法编辑密封的基类。