Tim*_*mwi 7 .net c# mutex mutual-exclusion
如果你在一个应用程序中有两个线程,并且你不希望它们同时运行某段代码,你就可以锁定这段代码,如下所示:
lock (someObject) {
// ... some code
}
Run Code Online (Sandbox Code Playgroud)
但是你如何在不同的流程中做同样的事情呢?我认为这是你使用"全局互斥"的原因,所以我Mutex以各种方式尝试了这个类,但它似乎不符合我的要求,它们是:
我遇到的问题:
Mutex在using(){...}子句中实例化一个对象似乎没有做任何事情; 两个实例仍然愉快地同时运行.WaitOne()互斥锁导致第一个实例运行而第二个实例等待,但第二个实例无限期等待,即使在第一次调用.ReleaseMutex()并离开using(){}范围之后也是如此..WaitOne()当第一个进程退出(System.Threading.AbandonedMutexException)时抛出异常.我该如何解决这个问题?不涉及的解决方案Mutex非常受欢迎,特别是因为它Mutex似乎是特定于Windows的.
我有两个应用程序:
ConsoleApplication1.cs
using System;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Mutex mutex = new Mutex(false, "AwesomeMutex");
Console.WriteLine("ConsoleApplication1 created mutex, waiting . . .");
mutex.WaitOne();
Console.Write("Waiting for input. . .");
Console.ReadKey(true);
mutex.ReleaseMutex();
Console.WriteLine("Disposed mutex");
}
}
}
Run Code Online (Sandbox Code Playgroud)
ConsoleApplication2.cs
using System;
using System.Threading;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Mutex mutex = new Mutex(false, "AwesomeMutex");
Console.WriteLine("ConsoleApplication2 Created mutex");
mutex.WaitOne();
Console.WriteLine("ConsoleApplication2 got signalled");
mutex.ReleaseMutex();
}
}
}
Run Code Online (Sandbox Code Playgroud)
启动ConsoleApplication1,然后ConsoleAplication2完美运行,没有错误.如果你的代码仍在轰炸,那么你的代码就是bug,而不是Mutex类.