我已经读过mutex
被线程拥有并且只能由拥有线程使用。在this answer中,解决方案建议每个进程必须拥有互斥锁的所有权,然后才能通知另一个进程。我必须承认我的愚蠢,我不知道如何使用IPC的活动,因为他们在我的MSDN阅读中没有弹出,我喜欢名字mutex
'作为我的解决方案,但我甚至不知道如何在WindowsService和常规流程之间转移所有权。请帮忙。
我可以添加,Jon Skeet的教程here告诉我,不同用户之间的通信,正如我想LocalSystem
所要求的那样,要求mutex
名称前缀为&# 39;全球\&#39 ;.我在.NET文档中找不到任何提及,我认为他是对的,我必须比MSDN系统更多地看到它。
答案 0 :(得分:1)
要获取已有Mutex的所有权,您可以使用静态方法Mutex.OpenExisting()和MutexRights = TakeOwnership
public static Mutex OpenExisting(
string name,
MutexRights rights)
考虑到OpenExisting()可以抛出UnauthorizedAccessException异常,我建议使用以下构造函数创建一个新的Mutex:
public Mutex(
bool initiallyOwned,
string name,
out bool createdNew
)
然后通过分析createdNew
变量的值,您可以检查mutext是否已存在或是否已创建新的。
答案 1 :(得分:0)
第一个过程:
// Create a new Mutex.
// True means this thread/process has inital ownership
Mutex mut = new Mutex(true, "some unique name");
//Now do your job
//Release ownership
mut.ReleaseMutex();
现在是第二个过程的代码。
// Create an instance of mutex object with the same name
// This means this thread/process has NOT inital ownership
Mutex mut = Mutex.OpenExisting("some unique name");
//Your thread will block until the first passes ownership
mut.WaitOne();
//Now you have it and can do your job
答案 2 :(得分:0)
This页似乎已经相当完整地回答了我的问题,这是一种品味:
好吧,成功
mutex.WaitOne()
完成后,当前线程是互斥锁的所有者。然后在调用mutex.ReleaseMutex()
后,线程不再拥有互斥锁。