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

时间:2010-12-23 08:36:38

标签: c# multithreading thread-safety backgroundworker

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

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

简而言之,我只想知道在C#中从后台工作线程访问全局变量是否安全

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

除非您按照前一段中的描述明确创建新副本,否则全局变量将改为无效。

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

<强>更新

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

答案 2 :(得分:1)

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

请参阅MSDN库中的“lock Statement”。

答案 3 :(得分:1)

不,它不是,除非您在使用任何数据字段时将其与lock(object) { }锁定。

答案 4 :(得分:1)

如果您没有修改任何字符串或变量,则无需锁定。

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

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

答案 5 :(得分:0)

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