我有3个单独的项目。命名为
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 1
和Thread 2
正在使用SharedData library
。我同时开始了这两个项目。由于我使用了lock
和mutex
,因此两个项目都能够以不同方式调用共享函数。我的问题是如果一个项目正在执行共享功能,其他应该等待。但它并没有发生。有什么问题可以告诉我。
答案 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
}