Tag: 锁定

在两个不同的代码块使用相同的锁对象?

我可以在两种方法中使用相同的锁对象,由两个不同的线程访问吗? 目标是使task1和task2线程安全。 object lockObject = new object(); // Thread 1 void Method1() { lock(lockObject) { // task1 } } // Thread 2 void Method2() { lock(lockObject) { // task2 } }

字典查找需要锁定吗?

lock(dictionaryX) { dictionaryX.TryGetValue(key, out value); } 在查找字典时是否需要锁定? 程序是multithreading的,并且在向dict添加键/值时。 dict被锁定了。

为什么锁定公共对象是一个坏主意

好吧,我已经使用了很多锁,但我以前从未有过这种情况。 我有两个不同的类,包含用于修改相同的MSAccess数据库的代码: public class DatabaseNinja { public void UseSQLKatana { //Code to execute queries against db.TableAwesome } } public class DatabasePirate { public void UseSQLCutlass { //Code to execute queries against db.TableAwesome } } 这是一个问题,因为数据库的事务不能并行执行,并且这些方法(UseSQLKatana和UseSQLCutlass)由不同的线程调用。 在我的研究中,我发现使用公共对象作为锁定对象是不好的做法,那么如何锁定这些方法以使它们不会串联运行? 答案只是让这些方法在同一个类中? (在我的实际代码中,这实际上并不那么简单)

使用lock语句在C#中进行递归/嵌套锁定

可能重复: C#中的重入锁定 我在这里看过StackOverflow和MSDN ,并且无法相信我在互联网上找不到这个问题。 假设我有一个私有成员的课程,我想在几个公共方法中访问。 这些公共方法将由​​不同的线程调用,因此需要同步。 public class MyClass { private Object SomeSharedData = new Object(); public void MethodA() { lock( SomeSharedData) { // do something MethodB(); } } public void MethodB() { lock( SomeSharedData) { // do something } } } 请注意,MethodA和MethodB可以由此类的用户调用,但MethodA也调用MethodB,这会导致嵌套锁定条件。 这保证是安全的吗? 换句话说,.NET是通过引用计数锁来处理这个,所以当我弹出这些方法时,锁会减少吗? 或者.NET在幕后执行一些魔术,它只是忽略了源自同一线程的对象上的所有后续锁定?

这是在C#中引发事件的有效模式吗?

更新 :为了让读者阅读此内容的好处,自.NET 4以来,由于自动生成事件的同步更改,锁定是不必要的,所以我现在就使用它: public static void Raise(this EventHandler handler, object sender, T e) where T : EventArgs { if (handler != null) { handler(sender, e); } } 并提出它: SomeEvent.Raise(this, new FooEventArgs()); 在阅读了Jon Skeet 关于multithreading的文章之后 ,我试图将他提倡的方法封装在一个像这样的扩展方法中引发事件(使用类似的通用版本): public static void Raise(this EventHandler handler, object @lock, object sender, EventArgs e) { EventHandler handlerCopy; lock (@lock) { handlerCopy = […]

在C#中使用LockFileEX

背景 我正在尝试在我的C#应用​​程序中实现块文件锁定。 如果内置的FileStream.Lock方法无法获取锁定,则会引发exception。 底层的LockFile方法返回状态代码但是我不想使用自旋锁来等待文件被解锁。 题 有没有人在C#中有任何代码片段,显示如何使用wait句柄正确构造OVERLAPPED结构并将其传递给LockFileEx并等待操作完成? 我试图避免使用Overlapped.Pack方法,因为它们不安全,但主要是因为它们需要IOCompletionCallback ,这不是我想要实现的。 我有声明,但OverLapped结构的构造和使用似乎有点复杂。 注意 :我知道我需要手动固定重叠结构,直到等待完成。 我目前的代码如下: ManualResetEvent evt = new ManualResetEvent(false); OVERLAPPED overlapped = new OVERLAPPED(); overlapped.OffsetLow = offsetLow; overlapped.OffsetHigh = offsetHigh; overlapped.hEvent = evt.SafeHandle; GCHandle h = GCHandle.Alloc(overlapped, GCHandleType.Pinned); int hr = Win32.LockFileEX(_handle, LockFlags.Exclusive, 0, offsetLow, offsetHigh, GCHandle.ToIntPtr(h)); if(hr == 0) { int error = Marshal.GetLastWin32Error(); if(error = […]

为什么锁在不同的对象上执行?

可能重复: 锁(锁柜)和锁(variable_which_I_am_using)之间的区别 在我见过的所有“线程安全”代码示例中,它们锁定了一个单独的虚拟对象。 为什么不能直接对有问题的数据执行锁定?

按字符串锁定。 这样安全/理智吗?

我需要按字符串锁定一段代码。 当然,以下代码非常不安全: lock(“http://someurl”) { //bla } 所以我一直在做一个替代品。 我通常不会在这里发布大量的代码,但是当涉及到并发编程时,我有点担心我自己的同步方案,所以我提交我的代码来询问是否理智这样做以这种方式或是否有一个更直接的方法。 public class StringLock { private readonly Dictionary keyLocks = new Dictionary(); private readonly object keyLocksLock = new object(); public void LockOperation(string url, Action action) { LockObject obj; lock (keyLocksLock) { if (!keyLocks.TryGetValue(url, out obj)) { keyLocks[url] = obj = new LockObject(); } obj.Withdraw(); } Monitor.Enter(obj); try { […]

如何从WPF应用程序中检测到“锁定此计算机”命令?

更喜欢使用WPF的C#,。Net 3.5中的答案(Windows Forms也没关系) 我有一个基本上是工具栏窗口或托盘图标的应用程序。 它需要检测用户是否锁定他/她的工作站并走开以便在集中式系统中更新该人的状态。 我可以使用SystemEvents轻松地检测会话切换或注销,但我不能在我的生活中弄清楚如何在Lock上检测或接收事件。 谢谢你的帮助。

在C#中的循环中使用lock语句

让我们尝试使用示例类SomeThread,我们试图阻止在Running属性设置为false之后调用DoSomething方法,并且由OtherThread类调用Dispose,因为如果在Dispose方法之后调用它们,则世界将以我们结束为止知道。 由于循环,感觉有可能发生邪恶的事情。 在启动下一个循环并且在调用DoSomething方法之前执行锁定之前,可以将Running更改为false,并在它到达锁之前调用Disposed。 在这种情况下,生活不会很好。 当我在一个简单易于维护的方法中使用循环时,我正在研究如何处理这个问题。 为了记录,我确实考虑过Double Lock Check图案,但它似乎并不适合C#。 警告:这是一个简化的示例,旨在让您轻松关注循环和锁定问题。 如果我没有详细说明某些地方请告诉我,我会尽我所能填写任何细节。 public class SomeThread : IDisposable { private object locker = new object(); private bool running = false; public bool Running { get { lock(locker) { return running; } } set { lock(locker) { running = value; } } } public void Run() { while (Running) […]