为什么会抛出废弃MutextException,以及如何避免它

本文关键字:何避免 MutextException 废弃 为什么 | 更新日期: 2023-09-27 18:01:06

下面的c#控制台应用程序(从文章"在c#.Net中使用Mutex和WaitOne with Threading"中粘贴的代码副本(在完成之前抛出

未处理放弃的MutextException
{"由于放弃互斥而完成的等待。"}{"因为放弃互斥而结束的等待

在线:

static Mutex mutex = new Mutex(false);  

通过阻止控制台输入的最后一行后:

Console.ReadLine();

哪里出了问题,如何纠正?

using System;
using System.Threading;
class Database
{
  static Mutex mutex = new Mutex(false);
  public static void SaveData(string text)
  {
    mutex.WaitOne();
    Console.WriteLine("Database.SaveData - Started");
    Console.WriteLine("Database.SaveData - Working");
    for (int i = 0; i < 100; i++)
    {
      Console.Write(text);
    }
    Console.WriteLine("'nDatabase.SaveData - Ended");
    mutex.Close();
  }
}
class ThreadMutexApp
{
  public static void WorkerThreadMethod1()
  {
    Console.WriteLine("Worker thread #1 - Started");
    Database.SaveData("x");
    Console.WriteLine("Worker thread #1 - Returned from Output");
  }
  public static void WorkerThreadMethod2()
  {
    Console.WriteLine("Worker thread #2 - Started");
    Database.SaveData("o");
    Console.WriteLine("Worker thread #2 - Returned from Output");
  }
  public static void Main()
  {
    ThreadStart worker1 = new ThreadStart(WorkerThreadMethod1);
    ThreadStart worker2 = new ThreadStart(WorkerThreadMethod2);
    Console.WriteLine("Main - Creating worker threads");
    Thread t1 = new Thread(worker1);
    Thread t2 = new Thread(worker2);
    t1.Start();
    t2.Start();
    Console.ReadLine();
  }
}

为什么会抛出废弃MutextException,以及如何避免它

线程先进入SaveData(),关闭静态互斥,使其在第二个线程中不可用。mutex.Close();应替换为mutex.ReleaseMutex();

引用MSDN

使用此方法释放的实例所拥有的所有资源WaitHandle。调用此方法后,将引用当前实例导致未定义的行为