Tag: 线程安全

msdn:什么是“线程安全”?

在许多MSDN文档中,这是在Thread Safety标题下编写的; “此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。任何实例成员都不保证是线程安全的。” 例如; 这里 有人能以一种相当简单的方式解释它吗? 谢谢 :)

安全地使用’HttpContext.Current.Cache’

我在这样的Web服务方法中使用Cache : var pblDataList = (List)HttpContext.Current.Cache.Get(“pblDataList”); if (pblDataList == null) { var PBLData = dc.ExecuteQuery(@”SELECT blabla”); pblDataList = PBLData.ToList(); HttpContext.Current.Cache.Add(“pblDataList”, pblDataList, null, DateTime.Now.Add(new TimeSpan(0, 0, 15)), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); } 但我想知道,这段代码是否是线程安全的? Web服务方法由多个请求者调用。 当缓存为空时,多个请求者可能会尝试检索数据并同时添加到Cache中。 查询需要5到8秒。 是否会围绕此代码引入锁定语句以防止任何可能的冲突? (我知道多个查询可以同时运行,但我想确保一次只运行一个查询。)

对多种方法使用相同的锁

到目前为止,我没有遇到任何问题使用相同的锁多种方法,但我想知道以下代码是否可能实际上有问题(性能?),我不知道: private static readonly object lockObj = new object(); public int GetValue1(int index) { lock(lockObj) { // Collection 1 read and/or write } } public int GetValue2(int index) { lock(lockObj) { // Collection 2 read and/or write } } public int GetValue3(int index) { lock(lockObj) { // Collection 3 read and/or write } } 无论如何,3种方法和集合无关。 […]

是否返回IEnumerable 线程安全?

我有一个Visual Studio 2008 C#.NET 3.5项目,我希望有一个线程安全的Foo对象池。 public class FooPool { private object pool_lock_ = new object(); private Dictionary foo_pool_ = new Dictionary(); // … public void Add(Foo f) { lock (pool_lock_) { foo_pool_.Add(SomeFooDescriminator, f); } } public Foo this[string key] { get { return foo_pool_[key]; } set { lock (pool_lock_) { foo_pool_[key] = value; } } […]

何时在C#中使用锁定线程?

我有一个服务器,它处理多个传入的套接字连接,并创建2个不同的线程,以XML格式存储数据。 我几乎在每个名为asyncronously的事件处理程序和代码的不同部分的2个线程中使用lock语句来实现线程安全。 遗憾地使用这种方法我的应用程序显着减慢。 我试图完全不使用lock ,服务器执行速度非常快,即使文件存储似乎也在提升; 但程序因30秒-1分钟后我不理解的原因而崩溃。 工作的。 所以。 我认为最好的方法是使用较少的锁或只在必要的地方使用它。 因此,我有两个问题: 当我写入公共访问变量(C#列表)时,甚至当我从中读取时,是否需要锁定? 是否只需要在套接字处理程序或其他地方创建的异步线程中进行锁定? 有人可以给我一些关于如何操作的实用指南。 我这次不会发布整个代码。 发布大约2500行代码是没有意义的。

线程安全集合,没有订单,也没有重复

我需要一个线程安全的集合来保存没有重复的项目。 ConcurrentBag允许HashSet , HashSet不是线程安全的。 在.NET Framework 4.5中是否有这样的集合?

使用现有对象而不是创建特定的锁对象是否安全?

编辑:事实certificate,当我浏览时,我发现一个看起来与我相同的问题,我之前没有找到: 锁(锁柜)和锁(variable_which_I_am_using)之间的区别 我正在寻找一些代码并试图解决锁定问题,我想到了。 现在我注意到在一些代码中我正在审查一个对象是这样创建的: private HashSet clustersInUse = new HashSet(); 然后在代码中进一步使用如下: lock (clustersInUse) { // Do something with the Hashset } 现在,这样做是否存在问题,而不是为锁创建特定对象。 像这样: private object clusterLocker = new object(); 如果上面的clustersInUse以某种方式被置于公共财产中,会发生什么呢? 此外,如果某些东西试图访问clustersInUse而没有锁定它同时它被锁定在另一个线程中会发生什么呢?

部分线程安全的字典

我有一个类维护一个缓存一些数据的私有Dictionary实例。 该类使用ReaderWriterLockSlim从多个线程写入字典。 我想在课外公开字典的值。 什么是线程安全的方法呢? 现在,我有以下内容: public ReadOnlyCollection Values() { using (sync.ReadLock()) return new ReadOnlyCollection(cache.Values.ToArray()); } 有没有办法这样做而不需要多次复制集合? 我正在使用.Net 3.5(不是4.0)

为什么来自线程教程的MSDN示例崩溃?

来自MSDN “线程教程”的示例4 以下代码错误出现在“—错误就在这里—”的行中。 怎么了? using System; using System.Threading; public class MutexSample { static Mutex gM1; static Mutex gM2; const int ITERS = 100; static AutoResetEvent Event1 = new AutoResetEvent(false); static AutoResetEvent Event2 = new AutoResetEvent(false); static AutoResetEvent Event3 = new AutoResetEvent(false); static AutoResetEvent Event4 = new AutoResetEvent(false); public static void Main(String[] args) { Console.WriteLine(“Mutex Sample […]

如何在c#上创建对象Threadsafe?

我有一个在大多数情况下需要线程的应用程序。 大多数情况下,我会遇到错误或错误的值,因为对象在每个线程执行之前都已更新。 您是否有任何建议如何使对象是线程安全的并确保对象具有正确的每个线程? 我应该让我的变量保持static吗?