在我的应用程序中,我创建了几个需要锁定的数据集。我想实现一种机制,为每个数据集创建信号量(以便可以同时访问不同的数据集)。 问题是当我尝试在一个类中创建信号量时:
new Semaphore(1, 1, $@"Global\{UniqueId}");
并且我检查它是否存在于不同的类中(具有相同的唯一ID):
Semaphore.TryOpenExisting($@"Global\{UniqueId}", out semaphore)
它不起作用 - 第二类无法打开它(认为它不存在)。
当我尝试切换到单个信号量时,就像这样:
new Semaphore(1, 1, @"Global\Foo", out created);
它工作正常,第二堂课能够打开它。
我的方法有问题吗?
我甚至尝试使用字符串实习生这样的名字:
string.Intern($@"Global\{UniqueId}")
但它没有帮助。
我也尝试在第一个类中创建信号量之后放入Thread.Sleep(),因为我想,也许第二个类无法找到它,导致它还没有在系统中写入或者其他东西 - 但仍然没有运气。
附加说明:我需要信号量,因为能够在一个线程中输入锁定并在另一个线程中释放它。 此外,这件事发生在自托管的WCF服务上 - 我不确定这是否会导致任何问题。
更新
在第一节课中创建List并将每个创建的信号量存储在其中的实际帮助。此后问题不再发生了。
我仍然不明白为什么 - 我没有在信号量的任何地方调用.Dispose()
或.Close()
以及我在文档中读到的内容,除非我调用这些方法,信号量应该仍然可用。