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()は、静的ミューテックスを閉じて、2番目に使用できなくなります。mutex.Close();に置き換える必要がありますmutex.ReleaseMutex();

MSDNを引用するには

このメソッドを使用して、WaitHandleのインスタンスによって保持されているすべてのリソースを解放します。このメソッドが呼び出されると、現在のインスタンスへの参照により未定義の動作が発生します。

于 2013-02-26T14:30:19.133 に答える