在后台工作线程中使用C#全局变量安全吗
嗨 我正在开发一个简单的桌面应用程序,它需要处理一些操作,比如加载网页,这可能会阻止主线程,所以我将代码移到了后台工作程序 我的问题是有一个名为UCSProject的重类,它包含许多字符串和列表字段,我需要将该类的一个实例传递给后台工作人员,因为该类有点重,我想通过直接使用全局变量来减少重复实例的数量,而不是将其作为参数传递给后台工作程序在后台工作线程中使用C#全局变量安全吗,c#,multithreading,thread-safety,backgroundworker,C#,Multithreading,Thread Safety,Backgroundworker,嗨 我正在开发一个简单的桌面应用程序,它需要处理一些操作,比如加载网页,这可能会阻止主线程,所以我将代码移到了后台工作程序 我的问题是有一个名为UCSProject的重类,它包含许多字符串和列表字段,我需要将该类的一个实例传递给后台工作人员,因为该类有点重,我想通过直接使用全局变量来减少重复实例的数量,而不是将其作为参数传递给后台工作程序 简而言之,我只想知道在C#中从后台工作线程访问全局变量是否安全。它是安全的,但您必须同步访问变量,例如,通过使用lock语句 请参阅MSDN库中的“”。除非两
简而言之,我只想知道在C#中从后台工作线程访问全局变量是否安全。它是安全的,但您必须同步访问变量,例如,通过使用
lock
语句
请参阅MSDN库中的“”。除非两个线程(后台和正常)都不修改对象,否则它是安全的
如果希望对象彼此修改,请使用否,否则不会修改,除非在使用其任何数据字段时使用lock(object){}将其锁定 通过您的问题,我怀疑您不了解变量如何工作到类。您不需要全局变量就可以只拥有对象的一个副本。所有变量都将指向完全相同的对象,除非您
克隆它或使用旧对象作为原型创建新对象
换句话说,全局变量不会更改任何内容,除非您按照上一段所述显式创建新副本
我也很想知道,如果你认为制作副本会影响你的表现,你的课会有多重?它的重量是多少mb
更新
本系列文章非常详细地描述了堆和堆栈是什么:如果不修改任何字符串或变量,则不需要锁定
<>我也会考虑在整个应用程序中共享数据时,使它成为一个静态类——那么就不需要传递一个实例。
如果需要修改或更新数据,请使用。您也可以使用[ThreadStatic]
。变量的值对于每个线程都是唯一的。请参阅以了解如何使用它 听起来(也许)你的UCSProject类应该以某种方式被分解,而不是深入了解它的内容等等,也许重构会更有益?对我来说,这听起来可能是个错误的问题。我无法给出权重的确切数字,因为它包含一些列表字段,这些字段的值是根据用户输入分配的,可能会达到几KB,但不会在MB范围内。即使是以位为单位,我认为在应用程序中也不建议使用重复的值。只要将变量作为方法参数传递,或者执行类似ucsprroject proj=originalProjVar代码>请原谅我的无知,但是引用类型不需要一些保持值(比如一些指针或其他东西)来引用它们吗?我的意思是,如果我们将引用类型作为参数传递,它必须发送一些东西,至少是引用,这是一个重复的引用,当然会有多个引用(比如指针)。但是同一个对象和多个指针将被更改,以不影响性能。我无意更改类中的任何值,非常感谢