0

以下 c# 控制台应用程序(代码复制粘贴自文章“在 C#.Net 中使用 Mutex 和 WaitOne 与线程”)在完成之前抛出

AbandonedMutextException 未处理。
{“由于放弃互斥体而完成等待。”}{“由于放弃互斥体而完成等待。”}

在线上:

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();
  }
}
4

1 回答 1

2

线程SaveData()首先进入,关闭静态互斥体并使其无法用于第二个。mutex.Close();应该替换为mutex.ReleaseMutex();

引用 MSDN

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

于 2013-02-26T14:30:19.133 回答