0

考虑我想分别运行 APP.exe 2 次。我需要定义一个在所有应用程序域中共享的变量。例如,我的代码中有一个整数 X,我在 app.exe(1) 中更改了它(表示应用程序的第一次运行),然后想在 app.exe(2) 中使用它(同一个应用程序的第二次运行)。但是每次变量初始化并且每个运行的应用程序都有它的 X。我知道如果我为 X 设置静态,这不会发生在 Web 应用程序中,但是对于 WPF 和 Winform,应用程序域是不同的,并且 X 是不同的。实际上我真正的问题是锁定实体模型。我想防止每个应用程序实例访问模型。我知道通过 SQL 可以实现,但我想在 C# 中锁定一个公共共享变量。

已编辑

我使用了 Mutex,但问题仍然存在。请看我的例子

private static Mutex mut = new Mutex();

public void Dopessimistic(int id , string name)
{       
    mut.WaitOne();
    {
        MessageBox.Show("nm1");
    }
}

我运行我的 app.exe 2 次。我希望该消息将只显示一次,因为我没有释放互斥锁,但对于 app.exe 的每次运行它都会起作用并显示该消息。实际上,互斥锁似乎不是在所有应用程序之间共享的,并且每次运行都有自己的互斥锁!

4

2 回答 2

0

你应该使用:

私有静态互斥量 mut = new Mutex(false,"MyAppMutex");

公共无效Dopessimistic(int id,字符串名称){

        mut.WaitOne();
        {
            MessageBox.Show("nm1");

        }

    }

这样,您将创建一个系统范围的Mutex.

如果您创建一个未命名的(就像您在代码中所做的那样),它将在您的应用程序中是本地的。

注意:如果一个应用程序获得了 的所有权Mutex并在没有释放它的情况下关闭,则 将Mutex被“放弃”,下一个等待 的线程Mutex将获得所有权。在您的测试中,这意味着 App.exe 的第二个实例也可以显示其文本,但只有在第一个实例关闭之后。

于 2017-09-10T09:33:56.243 回答
-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();

    }
于 2017-09-10T09:45:26.527 回答