考虑我想分别运行APP.exe 2次。我需要定义一个要在所有应用程序域中共享的变量。例如我的代码中有一个整数X,我在app.exe(1)中更改了它(意味着第一次运行app) 然后想在app.exe(2)中使用它(第二次运行相同的应用程序)。但是每次变量初始化并且每个运行的应用程序都有IT'X.我知道如果我为静态设置静态,在Web应用程序中不会发生这种情况,但对于WPF和Winform,应用程序域是不同的,X是不同的。 实际上我真正的问题是锁定实体模型。我想阻止每个应用程序实例访问模型。我知道SQL可以实现,但我想在C#中锁定一个公共共享变量。
EDITED
我使用的是互斥锁,但问题仍然存在。请看我的例子
private static Mutex mut = new Mutex();
public void Dopessimistic(int id , string name)
{
mut.WaitOne();
{
MessageBox.Show("nm1");
}
}
我运行我的app.exe 2次。我希望该消息只显示一次,因为我没有释放互斥锁,但是对于每次运行的app.exe它都能正常工作并显示消息。实际上,Mutex似乎不是在所有应用程序之间共享,每次运行都有自己的互斥锁!!
答案 0 :(得分:0)
您应该使用:
private static Mutex mut = new Mutex(false,“MyAppMutex”);
public void Dopessimistic(int id,string name) {
mut.WaitOne();
{
MessageBox.Show("nm1");
}
}
通过这种方式,您将创建一个全系统Mutex
。
如果您创建一个未命名的(就像您在代码中所做的那样),它将是您应用的本地内容。
注意:如果一个应用取得Mutex
的所有权并在未释放的情况下关闭,则Mutex
变为'已放弃'且下一个线程等待{{ 1}}将获得所有权。
在您的测试中,这意味着App.exe的第二个实例也会显示其文本,但仅在第一个实例关闭后才显示。
答案 1 :(得分:-1)
你可以通过多种方式实现这一目标。您可以将变量作为表单参数传递 -
private void button1_Click(object sender, EventArgs e)
{
int X=5;
Form2 frm2 = new Form2(X);
frm2.Show();
}
以第二种形式获得价值 -
public Form2(int X)
{
InitializeComponent();
textBox1.Text = X.ToString();
}