Tag: 锁定

C#我正确使用锁吗?

我目前正在尝试编写一个线程安全的记录器类。 我对这个领域的正确设计和最佳实践不是很熟悉。 我的代码中有缺陷吗? public class WriteStuff { private readonly StreamWriter m_Writer; private readonly object m_WriteLock = new object (); public WriteStuff(String path) { m_Writer = File.CreateText (path); m_Writer.WriteLine (“x”); m_Writer.Flush (); } public void ListenTo(Foo foo) { foo.SomeEvent += new EventHandler (Foo_Update); } private void Foo_Update(object sender, SomeArgs args) { lock (m_WriteLock) { m_Writer.WriteLine (args); […]

使用锁定Dictionary 的键

我有一个Dictionary 。 编辑:有人向我指出,我的榜样很糟糕。 我的全部意图不是更新循环中的引用,而是根据需要更新/获取数据的不同线程更新不同的值。 我将循环更改为方法。 我需要更新我的字典中的项目 – 一次一个键,我想知道在我的Dictionary对象的.key值上使用锁是否有任何问题? private static Dictionary matrixElements = new Dictionary(); //Pseudo-code public static void UpdateValue(string key) { KeyValuePair keyValuePair = matrixElements[key]; lock (keyValuePair.Key) { keyValuePair.Value = SomeMeanMethod(); } } 这会在法庭上举行还是失败? 我只是希望字典中的每个值都被独立锁定,因此锁定(和更新)一个值不会锁定其他值。 此外,我知道锁定将持续很长时间 – 但数据将无效,直到完全更新。

C#方法锁定SQL Server表

我有一个C#程序需要对SQL Server表执行一组批量更新(20k +)。 由于其他用户可以通过Intranet网站一次更新这些记录,我们需要构建能够锁定表的C#程序。 一旦表被锁定以防止其他用户进行任何更改/搜索,我们将需要预先形成所请求的更新/插入。 由于我们正在处理如此多的记录,因此我们不能使用TransactionScope (这似乎是最简单的方式),因为我们的事务最终由MSDTC服务处理。 我们需要使用另一种方法。 根据我在互联网上阅读的内容,使用SqlTransaction对象似乎是最好的方法,但是我无法让表锁定。 当程序运行并且我单步执行下面的代码时,我仍然可以通过Intranet站点执行更新和搜索。 我的问题是双重的。 我正确使用SqlTransaction吗? 如果是这样(或者即使没有)是否有更好的方法来获取表锁,允许当前程序运行以搜索和预先形成更新? 我希望在程序执行下面的代码时锁定表。 C# SqlConnection dbConnection = new SqlConnection(dbConn); dbConnection.Open(); using (SqlTransaction transaction = dbConnection.BeginTransaction(IsolationLevel.Serializable)) { //Instantiate validation object with zip and channel values _allRecords = GetRecords(); validation = new Validation(); validation.SetLists(_allRecords); while (_reader.Read()) { try { record = new ZipCodeTerritory(); _errorMsg = string.Empty; […]

ConcurrentDictionary是否是线程安全的,我可以将它用于静态缓存?

基本上,如果我想做以下事情: public class SomeClass { private static ConcurrentDictionary Cache { get; set; } } 这是否让我避免在整个地方使用lock ?

对多种方法使用相同的锁

到目前为止,我没有遇到任何问题使用相同的锁多种方法,但我想知道以下代码是否可能实际上有问题(性能?),我不知道: 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种方法和集合无关。 […]

锁定变量应该声明为volatile吗?

我有以下Lock声明: private readonly object ownerLock_ = new object(); lock (ownerLock_) { } 我应该为我的锁变量使用volatile关键字吗? private readonly volatile object ownerLock_ = new object(); 在MSDN上我看到它通常用于没有锁定访问的字段,所以如果我使用Lock我不需要使用volatile? 来自MSDN : volatile修饰符通常用于多个线程访问的字段,而不使用lock语句来序列化访问。

我应该锁定’事件’吗?

我应该在以下情况下锁定事件: 事件foo; 线程A:将调用foo + = handler; 线程B:将调用foo – = handler; 我应该锁定foo吗?

锁定集合与syncRoot的任何缺点?

我想知道锁定集合(例如List , HashSet或Dictionary而不是简单object是否有任何缺点。 注意:在以下示例中,这是锁定发生的唯一位置,它不会从多个位置锁定,但可以从多个线程调用静态方法。 此外, _dict永远不会在GetSomething方法之外访问。 我当前的代码如下所示: private static readonly Dictionary _dict = new Dictionary(); public static string GetSomething(string key) { string result; if (!_dict.TryGetValue(key, out result)) { lock (_dict) { if (!_dict.TryGetValue(key, out result)) { _dict[key] = result = CalculateSomethingExpensive(key); } } } return result; } 另一位开发人员告诉我,锁定集合会引起问题,但我持怀疑态度。 如果我这样做,我的代码会更有效吗? private static readonly Dictionary _dict = […]

T-SQL:手动锁定表几分钟

我知道这会很奇怪,但我想在我的MVC应用程序中触发错误,这个错误将基于LINQ查询,我希望从表中获取一条记录。 虽然此记录将使用T-SQL命令(例如无限循环始终更新此记录)被阻止(数据库/表/行)级别,但我的LINQ查询将执行查询以读取该记录。 当LINQ尝试然后结果应该在20-30秒后超时,有人曾经尝试过这个吗?

防止两个线程进入具有相同值的代码块

假设我有这个function(假设我以线程安全的方式访问Cache): object GetCachedValue(string id) { if (!Cache.ContainsKey(id)) { //long running operation to fetch the value for id object value = GetTheValueForId(id); Cache.Add(id, value); } return Cache[id]; } 我想防止两个线程同时运行“ 长时间运行”操作 相同的值 。 显然我可以将整个东西包装在一个lock()中,但是整个函数会阻塞而不管值是什么,我希望两个线程能够执行长时间运行的操作,只要它们正在寻找不同的id。 是否存在基于值锁定的内置锁定机制,因此一个线程可以在另一个线程完成长时间运行操作时阻塞,因此我不需要执行两次(或N次)? 理想情况下,只要在一个线程中执行长时间运行的操作 ,其他线程就不应该为相同的id值执行它。 我可以通过将id放在HashSet中然后在操作完成后删除它们来自己滚动,但这看起来像是一个黑客。