Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时创建命名信号量_C#_Multithreading - Fatal编程技术网

C# 在运行时创建命名信号量

C# 在运行时创建命名信号量,c#,multithreading,C#,Multithreading,在我的应用程序中,我创建了几个需要锁定的数据集。我想实现一种机制,为每个数据集创建信号量(以便可以同时访问不同的数据集)。 问题是,当我尝试在一个类中创建信号量时,如下所示: new Semaphore(1, 1, $@"Global\{UniqueId}"); new Semaphore(1, 1, @"Global\Foo", out created); 然后我检查它是否存在于不同的类中(使用相同的唯一ID): 它不工作-第二个类无法打开它(认为它不存在) 当我尝试切换到单信号灯时,类似

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

new Semaphore(1, 1, $@"Global\{UniqueId}");
new Semaphore(1, 1, @"Global\Foo", out created);
然后我检查它是否存在于不同的类中(使用相同的唯一ID):

它不工作-第二个类无法打开它(认为它不存在)

当我尝试切换到单信号灯时,类似这样的情况:

new Semaphore(1, 1, $@"Global\{UniqueId}");
new Semaphore(1, 1, @"Global\Foo", out created);
它工作得很好,第二节课可以打开它

我的方法有问题吗

我甚至试着用string intern来命名如下:

string.Intern($@"Global\{UniqueId}")
但这没有帮助

在第一个类中创建了信号量之后,我还尝试将Thread.Sleep()放在第一个类中,因为我想,可能第二个类中找不到它,因为它还没有写入系统或其他什么东西,但是仍然没有运气

附加说明:我需要信号量,因为可以在一个线程中输入锁,然后在另一个线程中释放它。 此外,这种情况正在自托管WCF服务上发生-我不确定这是否会导致任何问题


更新:

真正有帮助的是在第一个类中创建列表并在其中存储每个创建的信号量。此后,问题不再出现


我仍然不明白为什么-我没有在任何地方调用信号量上的
.Dispose()
.Close()
,从我在文档中阅读的内容来看,除非我调用这些方法,否则信号量应该仍然可用。

信号量的实际值是多少?
{UniqueId}
?它的GUID,在我的应用程序中,它的形式如下:“942e6892_9c71_4fe0_8938_49a3bb9e292b”如果您没有保留对在第一个类中创建的信号量的持久引用,它可能已经被垃圾收集,这将关闭它。是的,这将解释为什么我在更新下的帖子中描述的更改有效。但是我不理解为什么第一个方法(使用名称“Global\Foo”)“在没有存储任何信号量引用的情况下工作。很难确定,但请注意,您为“Global\Foo”版本提供的代码示例具有
out created
参数,该参数不在基于GUID的代码示例中。我怀疑这两个版本之间存在差异,可以解释不同的行为。