为什么会抛出废弃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();
}
}
线程先进入SaveData()
,关闭静态互斥,使其在第二个线程中不可用。mutex.Close();
应替换为mutex.ReleaseMutex();
引用MSDN
使用此方法释放的实例所拥有的所有资源WaitHandle。调用此方法后,将引用当前实例导致未定义的行为。