如何通过c#

时间:2017-09-10 08:59:20

标签: c# locking static-variables applicationdomain

考虑我想分别运行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似乎不是在所有应用程序之间共享,每次运行都有自己的互斥锁!!

2 个答案:

答案 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();

    }