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

嗨,我正在研究一个简单的桌面应用程序,它需要处理一些操作,如加载可能阻塞主线程的网页,所以我将代码移动到后台工作者。

我的问题是有一个名为UCSProject的重类,它包含许多字符串和List字段,我需要将这个类的实例传递给后台worker,因为类有点重,我想减少重复的次数实例直接使用全局变量,而不是将其作为参数传递给后台工作者。

为了简短起见,我只想知道从C#中的后台工作线程访问全局变量是否安全

它是安全的,除非你的线程(背景和正常)都没有修改对象。

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

根据你的问题,我怀疑你不明白变量如何运作。 您不需要全局变量只能拥有对象的一个​​副本。 所有变量都将指向完全相同的对象,除非您Clone它或创建一个旧的变量作为原型。

换句话说,全局变量将不会更改,除非您按照上一段中的描述显式创建新副本。

如果您认为通过创建它的副本会损害性能,我也想知道您的课程有多重? 它有多少重量?

更新

本系列文章详细介绍了堆和堆栈的内容: http : //www.c-sharpcorner.com/uploadfile/rmcochran/csharp_memory01122006130034pm/csharp_memory.aspx

它是安全的,但您必须同步对变量的访问,例如使用lock语句。

请参阅MSDN库中的“ lock语句 ”。

不,它不是,除非你使用lock(object) { }锁定它,只要你使用它的任何数据字段。

如果您没有修改任何字符串或变量,那么您不需要锁定。

如果数据在整个应用程序中共享,我还会考虑将其设置为静态类 – 然后您不需要传递实例。

如果您需要修改或更新数据 – 请使用Lock 。

您也可以使用[ThreadStatic] 。 对于每个线程,变量的值将是唯一的。 有关如何使用它,请参阅MSDN 。