代码之家  ›  专栏  ›  技术社区  ›  Sharun

C#从两个不同的线程使用单例

  •  1
  • Sharun  · 技术社区  · 17 年前

    我在wpf应用程序中使用单例模式,但对如何使其与多线程一起工作心存疑虑。

    在我正在做的主线上 Monitor.getMonitor.register(观察列表)或Monitor.getMonitor.unregister(…)取决于用户输入,我有一个DispatchTimer每200毫秒运行一次

    public class Monitor
    {
        private Hashtable Master; //key=device, value=list of settings to watch
        private static Monitor instance = new Monitor();
        private Monitor() {}
        public static Monitor getMonitor() 
        {
            return instance;
        }
        public void register(watchlist){...}
        public void unregister(...){...}
        public void update(){...}
    
    }
    

    update()只是从哈希表中读取内容。

    根据设备和设置的数量,update()将迭代hastable及其内容,以获取最新值。 主线程可能经常调用register和unregister,我希望gui保持响应。做这件事的好方法是什么?

    不太确定发生了什么,因为现有的代码并没有真正显示出任何问题,这本身就让我有点不安,因为它看起来是错误的。谢谢你的建议。..

    3 回复  |  直到 17 年前
        1
  •  11
  •   Jon Skeet    17 年前

    article on singleton implementations 使单例获取本身具有线程安全性。

    或 迭代哈希表。你可以使用 ReaderWriterLock ReaderWriterLockSlim

    (如果你使用的是.NET 2.0+,我建议使用泛型集合,例如 Dictionary<TKey, TValue> Hashtable

        2
  •  0
  •   vgru    17 年前

    是的,您应该锁定每个操作:

     public class Monitor
     {
         private Hashtable Master; //key=device, value=list of settings to watch
         ...
         private object tableLock = new object();
         public void register(watchlist) 
         {
             lock(tableLock) {
                 // do stuff
             }
         }
     }
    

        3
  •  0
  •   Joe    17 年前

    有几排?除非update()循环需要很长时间来进行迭代,否则我可能会锁定。如果主线程可能正在进行大量的注册/注销调用,那么更新可能会反复失败——如果连续20或30次调用失败,这是一个问题吗?