C#:如何防止应用程序的两个实例同时执行相同的操作?

Tim*_*mwi 7 .net c# mutex mutual-exclusion

如果你在一个应用程序中有两个线程,并且你不希望它们同时运行某段代码,你就可以锁定这段代码,如下所示:

lock (someObject) {
    // ... some code
}
Run Code Online (Sandbox Code Playgroud)

但是你如何在不同的流程中做同样的事情呢?我认为这是你使用"全局互斥"的原因,所以我Mutex以各种方式尝试了这个类,但它似乎不符合我的要求,它们是:

  • 如果您是唯一的实例,请继续运行代码.
  • 如果您是第二个实例,请等待第一个实例完成,然后运行代码.
  • 不要抛出异常.

我遇到的问题:

  • 只是Mutexusing(){...}子句中实例化一个对象似乎没有做任何事情; 两个实例仍然愉快地同时运行
  • 调用.WaitOne()互斥锁导致第一个实例运行而第二个实例等待,但第二个实例无限期等待,即使在第一次调用.ReleaseMutex()并离开using(){}范围之后也是如此.
  • .WaitOne()当第一个进程退出(System.Threading.AbandonedMutexException)时抛出异常.

我该如何解决这个问题?不涉及的解决方案Mutex非常受欢迎,特别是因为它Mutex似乎是特定于Windows的.

Jul*_*iet 5

我有两个应用程序:

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类.