C# 浅析并行任务同步机制——Mutex类

一、Mutex类

       Mutex(mutual exclusion,互斥),是.Net Frameworkt中提供跨多个进程同步访问的一个类。

       Mutex,继承与WaitHandle

       注:一次只能有一个线程访问互斥保护的同步代码区域

二、应用场景

       场景1:可以禁止同一应用程序启动两次。

    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        /// <summary>
        /// 当前应用程序不能启动两次。
        /// </summary>
        /// <param name="e"></param>
        protected override void OnStartup(StartupEventArgs e)
        {
            bool createNew;
            Mutex mutex = new Mutex(false, "SingletonDemo", out createNew);
            if (!createNew)
            {
                MessageBox.Show("应用已经启动,不能再次启动");
                Application.Current.Shutdown();
            }
            base.OnStartup(e);
        }
    }

这个是WPF,判断程序是否启动。

实际项目开发时,我这遇到了上述代码,不起作用。

这时需要将 Mutex创建为成员变量,不是局部变量如下

    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        Mutex mutex;  //声明为成员变量,可以解决问题
        /// <summary>
        /// 当前应用程序不能启动两次。
        /// </summary>
        /// <param name="e"></param>
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            bool createNew;
            mutex = new Mutex(false, "SingletonDemo", out createNew);
            if (!createNew)
            {
                MessageBox.Show("应用已经启动,不能再次启动。");
                Application.Current.Shutdown();
            }
           
        }
    }

场景2:跨进程访问

使用Mutex 的 

      WaitOne 阻止当前线程,直到当前WaitHandle收到信号 

      ReleaseMutex 释放Mutex一次

互斥进程1代码:

 class Program
    {
        static void Main(string[] args)
        {
            bool _isHaveY;
            var mutex = new Mutex(false, "Singlot", out _isHaveY);
            if (mutex.WaitOne())
            {
                try
                {
                    for (var i = 0; i < 10; i++)
                    {
                        WriteLine($"MutexDemoOne i = {i.ToString()};");
                        Thread.Sleep(3000);
                    }
                }
                finally
                {
                    mutex.ReleaseMutex();
                    WriteLine("MutexDemoOne mutext Realase");
                }
            }
            else
            {
                WriteLine("MutexDemoOne检测到Mutext互斥对象运行");
            }
            WriteLine("");
            ReadLine();
        }
    }

互斥进程2代码:

class Program
{
        static void Main(string[] args)
        {
            bool _isHaveY;
            var mutex = new Mutex(false, "Singlot", out _isHaveY);
            if (mutex.WaitOne())
            {
                try
                {
                    for (var i = 0; i < 10; i++)
                    {
                        WriteLine($"MutexDemoTwo i = {i.ToString()};");
                        Thread.Sleep(2000);
                    }
                }
                finally
                {
                    mutex.ReleaseMutex();
                    WriteLine("MutexDemoTwo mutext Realase");
                }
            }
            else
            {
                WriteLine("MutexDemoTwo检测到Mutext互斥对象运行");
            }
            WriteLine("");
            ReadLine();
        }
}

场景1和场景2,用到的是Mutex的三个参数的构造函数。想要构建两个进程互斥的应用,就是使互斥体名称相同,就是构造函数的第二个参数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fervour

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值