Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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_Thread Safety_Backgroundworker - Fatal编程技术网

在后台工作线程中使用C#全局变量安全吗

在后台工作线程中使用C#全局变量安全吗,c#,multithreading,thread-safety,backgroundworker,C#,Multithreading,Thread Safety,Backgroundworker,嗨 我正在开发一个简单的桌面应用程序,它需要处理一些操作,比如加载网页,这可能会阻止主线程,所以我将代码移到了后台工作程序 我的问题是有一个名为UCSProject的重类,它包含许多字符串和列表字段,我需要将该类的一个实例传递给后台工作人员,因为该类有点重,我想通过直接使用全局变量来减少重复实例的数量,而不是将其作为参数传递给后台工作程序 简而言之,我只想知道在C#中从后台工作线程访问全局变量是否安全。它是安全的,但您必须同步访问变量,例如,通过使用lock语句 请参阅MSDN库中的“”。除非两

嗨 我正在开发一个简单的桌面应用程序,它需要处理一些操作,比如加载网页,这可能会阻止主线程,所以我将代码移到了后台工作程序

我的问题是有一个名为UCSProject的重类,它包含许多字符串和列表字段,我需要将该类的一个实例传递给后台工作人员,因为该类有点重,我想通过直接使用全局变量来减少重复实例的数量,而不是将其作为参数传递给后台工作程序


简而言之,我只想知道在C#

中从后台工作线程访问全局变量是否安全。它是安全的,但您必须同步访问变量,例如,通过使用
lock
语句


请参阅MSDN库中的“”。

除非两个线程(后台和正常)都不修改对象,否则它是安全的


如果希望对象彼此修改,请使用

否,否则不会修改,除非在使用其任何数据字段时使用lock(object){}将其锁定

通过您的问题,我怀疑您不了解变量如何工作到类。您不需要全局变量就可以只拥有对象的一个副本。所有变量都将指向完全相同的对象,除非您
克隆它或使用旧对象作为原型创建新对象

换句话说,全局变量不会更改任何内容,除非您按照上一段所述显式创建新副本

我也很想知道,如果你认为制作副本会影响你的表现,你的课会有多重?它的重量是多少mb

更新


本系列文章非常详细地描述了堆和堆栈是什么:

如果不修改任何字符串或变量,则不需要锁定

<>我也会考虑在整个应用程序中共享数据时,使它成为一个静态类——那么就不需要传递一个实例。
如果需要修改或更新数据,请使用。

您也可以使用
[ThreadStatic]
。变量的值对于每个线程都是唯一的。请参阅以了解如何使用它

听起来(也许)你的UCSProject类应该以某种方式被分解,而不是深入了解它的内容等等,也许重构会更有益?对我来说,这听起来可能是个错误的问题。我无法给出权重的确切数字,因为它包含一些列表字段,这些字段的值是根据用户输入分配的,可能会达到几KB,但不会在MB范围内。即使是以位为单位,我认为在应用程序中也不建议使用重复的值。只要将变量作为方法参数传递,或者执行类似
ucsprroject proj=originalProjVar请原谅我的无知,但是引用类型不需要一些保持值(比如一些指针或其他东西)来引用它们吗?我的意思是,如果我们将引用类型作为参数传递,它必须发送一些东西,至少是引用,这是一个重复的引用,当然会有多个引用(比如指针)。但是同一个对象和多个指针将被更改,以不影响性能。我无意更改类中的任何值,非常感谢