0

这似乎是一个基本问题,但谷歌并没有帮助我......如何在 C#.NET WPF 中进行基本线程锁定?在我相当简单的用户应用程序中,我有多个线程执行耗时的操作,将它们的结果保存到一个通用数据结构中或从这个通用数据结构中读取。我希望能够围绕访问此数据结构进行 lock() 和 unlock() 以维护线程安全。但是,我的代码中有很多不同的地方可以访问这个数据结构,而不仅仅是一个。哪些 .NET 对象用于实现这种锁定?

4

4 回答 4

2

有多种方法可以实现同步。请查看我创建的屏幕截图 在此处输入图像描述

于 2012-09-21T02:33:18.247 回答
2

尝试这个:

public static class LockHolder
{
    public static object Lock = new object();
}

然后,在您的代码中,使用:

lock(LockHolder.Lock)
{
    //your safe code
}

http://msdn.microsoft.com/en-us/library/c5kehkcz(v=vs.71).aspx

我想更多信息可能会有所帮助。IIRC,lock(object o)基本上是一个宏,将由编译器扩展,然后限制对您的安全代码的访问,这是您所期望的。不一定显而易见的是,任何对象o都可以是锁,并且o每个安全锁都需要每个对象。如果我有

object a = new object();
object b = new object();

并执行 a lock(a)then不会阻止访问lock(b)周围有 a 的东西。大多数代码示例都显示了lock(this)将锁定到特定类的当前实例,如果您需要全局锁定并且该类的多个实例在周围运行,这不是您想要的。

于 2012-09-21T00:41:31.507 回答
0

查看 Sacha Barber 在 CodeProject 上的这篇精彩文章。

http://www.codeproject.com/Articles/27366/Beginner-s-Guide-to-Threading-in-NET-Part-3-of-n

它解释了一些同步机制..

干杯

于 2012-09-21T03:27:47.703 回答
0

使用诸如System.Collections.Concurrent命名空间中的线程安全数据结构可能更容易。他们为您完成所有工作。

于 2012-09-21T00:54:50.217 回答