如何通过c#在所有应用程序域中定义一个公共变量
How to define a common variable in all application domains by c#
考虑我要分别运行APP.exe2次。我需要定义一个在所有应用程序域中共享的变量。例如我的代码中有一个整数 X,我在 app.exe(1) 中更改了它(表示应用程序的第一个 运行)
然后想在 app.exe(2)(同一应用程序的第二个 运行)中使用它。但是每次变量初始化并且每个 运行 应用程序都有 IT'S 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 的每个 运行 它都有效并显示消息。实际上,互斥量似乎并没有在所有应用程序之间共享,每个 运行 都有自己的互斥量!!
你应该使用:
private static Mutex mut = new Mutex(false,"MyAppMutex");
public void Dopessimistic(int id, string name)
{
mut.WaitOne();
{
MessageBox.Show("nm1");
}
}
通过这种方式,您将创建一个系统范围的 Mutex
。
如果您创建一个未命名的(就像您在代码中所做的那样),它将在您的应用程序中是本地的。
注意:如果一个应用程序获得了 Mutex
的所有权并且在没有释放它的情况下关闭,则 Mutex
变为 'abandoned' 并且等待 Mutex
的下一个线程将获得所有权。
在您的测试中,这意味着 App.exe 的第二个实例也可以显示其文本,但仅在第一个实例关闭后才会显示。
您可以通过多种方式做到这一点。您可以将变量作为表单参数传递 -
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();
}
考虑我要分别运行APP.exe2次。我需要定义一个在所有应用程序域中共享的变量。例如我的代码中有一个整数 X,我在 app.exe(1) 中更改了它(表示应用程序的第一个 运行) 然后想在 app.exe(2)(同一应用程序的第二个 运行)中使用它。但是每次变量初始化并且每个 运行 应用程序都有 IT'S 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 的每个 运行 它都有效并显示消息。实际上,互斥量似乎并没有在所有应用程序之间共享,每个 运行 都有自己的互斥量!!
你应该使用:
private static Mutex mut = new Mutex(false,"MyAppMutex");
public void Dopessimistic(int id, string name) {
mut.WaitOne();
{
MessageBox.Show("nm1");
}
}
通过这种方式,您将创建一个系统范围的 Mutex
。
如果您创建一个未命名的(就像您在代码中所做的那样),它将在您的应用程序中是本地的。
注意:如果一个应用程序获得了 Mutex
的所有权并且在没有释放它的情况下关闭,则 Mutex
变为 'abandoned' 并且等待 Mutex
的下一个线程将获得所有权。
在您的测试中,这意味着 App.exe 的第二个实例也可以显示其文本,但仅在第一个实例关闭后才会显示。
您可以通过多种方式做到这一点。您可以将变量作为表单参数传递 -
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();
}