在运行时创建命名信号量

时间:2016-02-24 13:02:52

标签: c# multithreading

在我的应用程序中,我创建了几个需要锁定的数据集。我想实现一种机制,为每个数据集创建信号量(以便可以同时访问不同的数据集)。 问题是当我尝试在一个类中创建信号量时:

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()以及我在文档中读到的内容,除非我调用这些方法,信号量应该仍然可用。

0 个答案:

没有答案