您好 我正在研究一个简单的桌面应用程序,它需要处理一些操作,比如加载一个可能阻塞主线程的网页,所以我把代码移到了后台工作者。
我的问题是有一个名为UCSProject的繁重类,其中包含许多字符串和List字段,我需要将此类的实例传递给后台worker,因为该类有点重,我想减少直接使用全局变量的重复实例数,而不是将其作为参数传递给后台工作程序。
简而言之,我只想知道在C#中从后台工作线程访问全局变量是否安全
答案 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)
答案 5 :(得分:0)
您也可以使用[ThreadStatic]
。每个线程的变量值都是唯一的。有关如何使用它,请参阅MSDN。