使用互斥锁在应用程序之间锁定方法

时间:2017-01-06 10:07:58

标签: c# multithreading

我有3个单独的项目。命名为

  1. SharedData - >班级图书馆
  2. 线程1 - >窗口应用
  3. 线程2 - >控制台应用程序
  4. SharedData包含以下两个功能:

    public class SharedData
    {
        static private Mutex mut = new Mutex();
    
        public static void PrintNumbersMutex()
        {
    
            mut.WaitOne();
            for (int i = 0; i < 500000000; i++)
            {
                Console.WriteLine(" i = " + i);
            }
            mut.ReleaseMutex();
        }
    }
    

    线程1:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            SharedData.DataHolder.PrintNumbersMutex();
        }
    }
    

    主题2:

    public class User2
    {
        static void Main(string[] args)
        {
            SharedData.DataHolder.PrintNumbersMutex();
            Console.ReadKey();
        }
    }
    

    Thread 1Thread 2正在使用SharedData library。我同时开始了这两个项目。由于我使用了lockmutex,因此两个项目都能够以不同方式调用共享函数。我的问题是如果一个项目正在执行共享功能,其他应该等待。但它并没有发生。有什么问题可以告诉我。

1 个答案:

答案 0 :(得分:1)

您需要使用全局互斥:

string mutexId;
if (useGlobal) //Here global refers to across users on that machine
{
    mutexId = String.Format("Global\\{{{0}}}", _appGuid);
}
else
{
    mutexId = String.Format("{{{0}}}", _appGuid);
}

上面的示例使用应用程序GUID,从单个实例化应用程序的程序集信息中。您可以使用任何唯一的字符串,例如:

mutexId = String.Format("{{{0}}}", "MyUniqueString");

您将互斥锁定义为:

private static Mutex _mutex;

并将其实例化为:

_mutex = new Mutex(false, mutexId);

然后您可以在方法中使用互斥锁:

try
{
    if (_mutex.WaitOne(timeOut, false))
    {
        //Process
        _mutex.RealeaseMutex();
    }
    else
    {
        //Handle not receiving the mutex
    }
}
catch (AbandonedMutexException)
{
    //Handle
}