问题是:怎么样在console 窗口程序被强行关闭时,仍然能够释放mutex对象?
来源如下:
正在学习多线程,关于Mutex的示例很简单,程序如下
static void Main(string[] args)
{
const string MutexName = “CSharpThreadingCookBook”;
using (var m = new Mutex(false, MutexName))
{
if (!m.WaitOne(TimeSpan.FromSeconds(10), false))
{
Console.WriteLine(“Second instance is running”);
Console.ReadLine();
}
else
{
Console.WriteLine(“Running”);
Console.ReadLine();
m.ReleaseMutex();
}
}
效果就是,假如运行一个实例,会显示running,这时候再运行第二个实例,开始就什么也不显示了 –》
假如在第二个实例开始运行10秒内,在第一个实例内敲下回车,第二个实例就显示running,假如过了10秒,就会出现second instance is ruuning字样了。
—
问题在于:假如不是在第一个实例内敲下回车,而是直接点叉来关闭console 窗口,就会在第二个实例内跳出一个异常来。本人稍微改了改,捕捉这个异常:
try
{
if (!m.WaitOne(TimeSpan.FromSeconds(10), false))
{
Console.WriteLine(“Second instance is running”);
Console.ReadLine();
}
else
{
Console.WriteLine(“Running”);
Console.ReadLine();
m.ReleaseMutex();
}
}
catch (Exception e)
{
if (e is AbandonedMutexException)
Console.WriteLine(e.Message);
else
Console.WriteLine(“not spot type”);
Console.ReadLine();
}
这样就好了,不会异常退出,而是捕捉到之后进行处理。可是本人还是想问一句:
—
怎么样做才能保证在console 窗口被点叉关闭时,也能正常release这个mutex?谢谢
来源如下:
正在学习多线程,关于Mutex的示例很简单,程序如下
static void Main(string[] args)
{
const string MutexName = “CSharpThreadingCookBook”;
using (var m = new Mutex(false, MutexName))
{
if (!m.WaitOne(TimeSpan.FromSeconds(10), false))
{
Console.WriteLine(“Second instance is running”);
Console.ReadLine();
}
else
{
Console.WriteLine(“Running”);
Console.ReadLine();
m.ReleaseMutex();
}
}
效果就是,假如运行一个实例,会显示running,这时候再运行第二个实例,开始就什么也不显示了 –》
假如在第二个实例开始运行10秒内,在第一个实例内敲下回车,第二个实例就显示running,假如过了10秒,就会出现second instance is ruuning字样了。
—
问题在于:假如不是在第一个实例内敲下回车,而是直接点叉来关闭console 窗口,就会在第二个实例内跳出一个异常来。本人稍微改了改,捕捉这个异常:
try
{
if (!m.WaitOne(TimeSpan.FromSeconds(10), false))
{
Console.WriteLine(“Second instance is running”);
Console.ReadLine();
}
else
{
Console.WriteLine(“Running”);
Console.ReadLine();
m.ReleaseMutex();
}
}
catch (Exception e)
{
if (e is AbandonedMutexException)
Console.WriteLine(e.Message);
else
Console.WriteLine(“not spot type”);
Console.ReadLine();
}
这样就好了,不会异常退出,而是捕捉到之后进行处理。可是本人还是想问一句:
—
怎么样做才能保证在console 窗口被点叉关闭时,也能正常release这个mutex?谢谢
解决方案
10
你吧概念给看歪了。这不是多线程,这是多进程,因此基本上不用这个东西。
假如用,偶尔一些开源系统会使用(例如一个字节的)文件为共享控制,而不是用这个方式。
假如用,偶尔一些开源系统会使用(例如一个字节的)文件为共享控制,而不是用这个方式。
10
为什么要避免这个异常呢?你的处理AbandonedMutexException方式是对的。AbandonedMutexException就是操作系统帮你解决Mutex释放的方式。
意外关闭/程序崩溃等情况下,程序是不一定有机会运行清理过程的。
这种情况下,操作系统负责清理资源是很有意义的。