Sha*_*run 1 c# singleton multithreading
我在wpf应用程序中使用单例模式,但对如何使其适用于多个线程存有疑虑.
我有一个名为Monitor的类,它维护一个"设置"列表,供不同的"设备"使用.大纲如下所示.
在我的主线程上,我正在执行Monitor.getMonitor.register(watchlist)或Monitor.getMonitor.unregister(...),具体取决于用户输入,并且我每隔200ms执行一次DispatchTimer执行Monitor.getMonitor.update()
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(){...}
}
Run Code Online (Sandbox Code Playgroud)
register()/ unregister()对hastable执行add/remove.update()只是从哈希表中读取东西.
根据设备和设置的数量,update()将迭代hastable及其内容,获取最新值.主线程可能经常调用注册和注销,我希望gui保持响应.这是一个很好的方法吗?
我是否锁定哈希表,围绕添加/删除和迭代,或者只是使用try catch(ala优雅地失败)来覆盖更新中的迭代部分,以捕获哈希表可能进入的任何奇怪状态(无锁定)或者是否有更好的方法要做到这一点(如果更新失败没有概率..无论如何将再次在200ms运行).
不太确定发生了什么,导致代码没有真正显示任何问题本身让我有点不安因为它似乎错了.谢谢你的任何建议......
Jon*_*eet 11
请参阅我关于单例实现的文章,以使单例获取自身线程安全.
是的,当您修改或迭代哈希表时,您需要锁定.您可以使用ReaderWriterLock(或最好ReaderWriterLockSlim在.NET 3.5中)一次允许多个读者.如果你在迭代时需要做很多工作,你可以随时锁定,复制,解锁,然后处理副本 - 只要工作不介意副本有点陈旧.
(如果你使用的是.NET 2.0+,我建议使用泛型集合Dictionary<TKey, TValue>而不是Hashtable.我还建议你根据.NET约定重命名你的方法.这个代码目前有一个独特的Java口音;)