gpt4 book ai didi

C# - 在混合使用文件和文件夹的线程中锁定(线程安全)

转载 作者:行者123 更新时间:2023-11-30 15:45:35 25 4
gpt4 key购买 nike

我想问一下C#或.net中是否有一种特殊的机制可以做到以下几点:

我有一个多线程应用程序,我想防止线程对同一个文件/文件夹执行某些操作。就像 lock(Object obj) 命令一样,如果其他线程正在更改此文件或文件夹或子文件夹上的某些内容,它应该阻止。

例如:
所有线程同时启动(好的伪同一时间;))。
线程A:使用folder1\folder2\file.txt,应该用机制锁定它。
线程 B:使用 folder1\file2.txt 并且应该打开另一个锁
线程C:想重命名folder1,只要线程A和线程B释放锁就应该被阻塞。
线程 D:重命名 folder3 并打开一个不会阻止任何内容的锁。
只是一个我想看到的例子......

应该可以有无限的层次依赖。我知道有一些支持文件锁定的机制,也许还有一些东西可以用子文件夹锁定文件夹并防止父文件夹更改。如果没有,那么我必须自己实现。

最佳答案

这听起来很神奇。但您实际上可以锁定字符串。

lock (@"c:\file.txt") {
// Do something
}

原因是 .Net 在内部处理字符串的方式。通常任何两个包含相同数据的字符串都是对同一对象的引用。或者,您可以将它们添加到字典中(键是唯一条目)并使用值(对象)进行锁定。

这是一个简单的例子:

Dictionary<string, object> LockObjects = new Dictionary<string, object>();
void DoStuff(string file) {
// Lock while modifying LockObjects
string lockObj = null;
lock (LockObjects) {
if (!LockObjects.Contains(file))
LockObjects.Add(file, new Object());
lockObj = LockObjects[file];
}
lock (lockObj) {
// Do stuff to the file
}
}

lock () 也会等待其他线程完成,因此任何线程都可以安全地锁定和等待。

在您的程序逻辑中,您必须确保不会出现死锁情况。例如 Thread1 锁定 File1。 Thread2 打开 File2。 T1 在获得对 F2 的锁定之前不会继续。 T2 在获得对 F1 的锁定之前不会继续。双方将永远等待。这必须通过设计来避免!

关于C# - 在混合使用文件和文件夹的线程中锁定(线程安全),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5064727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com