English 中文(简体)
多 种 B. 翻新锁和监控不工作的班级
原标题:Multi Threading locks and monitor class not working
  • 时间:2009-10-23 18:18:26
  •  标签:

我有一份读写的文件。 我需要确保在写给它时,没有人会试图给它写信。

I put a lock on the whole function which allows to either read or write but I still get errors such as The process cannot access the file FILENAME because it is being used by another process.

public static TYPE Property{

get{
    data mydata;
    Object obj = new object();
    Monitor.Enter(obj);

    // check if data has not changed
    // if it has not, just read

    using (Stream stream = File.Open(fileLocation, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
        //....
    }
    // else, if data changed, then need to write to  file to save the new data

    using (Stream stream = File.Open(fileLocation, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read)) {
        BinaryFormatter bf = new BinaryFormatter();

        try {
            bf.Serialize(stream, (data);
        }
        //DONE processing

        Monitor.Pulse(obj);
        Monitor.Exit(obj);
        return data
}
最佳回答

您重新创建new,每当财产被援引时,就锁定。 您需要在same上锁定,否则就没有任何点关在锁定上。

你们也应当只使用“锁定”声明——你永远不会等待,因此在ul中没有任何点。 目前,如果出现任何例外,你就把“le锁”倒闭。 这通常会是一个非常糟糕的问题,但是,由于你不再利用任何途径来掩盖这一问题。

例如:

private static readonly object monitor = new object();

public static TYPE Property
{
    get
    {
        lock(monitor)
        {
            // check if data has not changed
            // if it has not, just read
            using (Stream stream = File.Open(fileLocation, 
                   FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                ....
            }
            // else, if data changed, then need to write to 
            // file to save the new data
            using (Stream stream = File.Open
                       (fileLocation, FileMode.OpenOrCreate,
                        FileAccess.ReadWrite, FileShare.Read))
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(stream, data);
            }
            return data;
        }
    }
}

除此以外,这比我真正期望在财产方面做得更多。 你们是否相信某种方法会更有意义?

问题回答

Well, Monitor. 进入试图在SAME物体上放置一锁的深层通道。 你们每次进入你们的大门,都会制造新的物体,因此,每名打电话者都有一个新锁,相互不了解。

换言之,没有锁定。

作为附带说明——为什么你不使用锁定声明? 你们仍然需要一个全球性的锁定目标。

全球变量与你的当地变量的缘由是,LOCK实际上正在像我所理解的那样,将一个参照点锁定下来。 每一次,你都会立即提出新的目标,即: “Object obj = 新的物体;”,你重造一个新物体,拥有独特的记忆点。 因此,当LOCK想看到记忆点是否被锁定时,它就没有了。 因为它在记忆中带有新品牌的参照点,唯一的使用点是进入你的财产的打电话者。 凭借你们在全球宣布的奥杰变量,它永远是记忆的同一个点,锁定实际上能够证明,事实上,这个记忆点要么现在被锁定,要么可以自行锁定。

实例:(但我想到这一点)

<编码> 物体/代码

现在,你们有这样一个记忆:

记忆

    * obj1

现在你再次进入你的财产,并再次制造新的物体。 你的系统记忆现在喜欢......

记忆

   * obj1
   * obj2

在第一次旅行时,你的锁正在检查“Obj1”的记忆。 由于第一次前往贵方财产的人是唯一使用奥贝吉事件的人,因此,那只剩下锁或检查了。 因为它在记忆中观看了这一奥比参考资料。

在第二次旅行时,你的锁为“Obj2”记。

当你使用一个全球变量时,这一记忆点始终如此锁定,始终保持同样的记忆。 它永远不会移动,它总是记忆中同样的参照点。 因此,你们财产的所有打电话者将永远怀念同一点,你的锁定将取得成功。

特别说明:我不说“obj”的生命时间。 我只是说,这在多面的进程中是如何运作的。 希望能够提供帮助。





相关问题
热门标签