从从不同表单调用的静态类中多次打开表单
本文关键字:表单 调用 静态类 | 更新日期: 2023-09-27 18:18:56
如果我打开一个名为FormX的表单,对其公共(非静态)变量"Var"进行一些处理。"Var"从调用表单中设置,然后处理并返回输出。我在执行期间多次从多个表单打开它。所有表单同时运行。它工作得很好,因为每个FormX都是使用来自其父窗体的对象的单独实例打开的。但我有一个公共静态类"Abc"在我的项目,这是可访问的所有形式,如果我添加一个代码:
public static class Abc
{
public static string Open_form(string Var)
{
FormX Obj = new FormX();
Obj.Var = Var;
Obj.Show();
Obj.Process_Var();
Var = Obj.Var;
Obj.Close();
return Var;
}
}
并在表单的某个地方调用它(并且多次调用),例如:
Form1_Load()
{
//Some operations
MessageBox.Show(Abc.Open_form("ABC"));
//Some operations
MessageBox.Show(Abc.Open_form("XYZ"));
}
Form2_Load()
{
//Some operations
MessageBox.Show(Abc.Open_form("123"));
//Some operations
MessageBox.Show(Abc.Open_form("456"));
}
表单1和表单2从主表单中打开:
Form1 obj1 = new Form1();
obj1.Show();
Form2 obj2 = new Form2();
obj2.Show();
那么会有什么问题吗?如果两种形式同时调用静态调用,变量"Var"的处理会有问题吗?还有一个问题,我应该把FormX.Dispose();
命名为FormX.Close();
之后吗?为什么?为什么不?FormX.Dispose()
有什么好处吗?
如果FormX.Var
是static
属性或字段,那么是的,当多个线程或对象同时使用它时可能会出现问题。如果FormX.Var
不是static
,那么没有,应该没有问题。
IDisposable
的对象上调用Dispose
。GC有一种方法可以为您调用它,但最好的做法是自己调用它。为了方便起见,可以使用c#的using
关键字。下面的语法自动调用Dispose
。
using (FormX Obj = new FormX())
{
...
}
你很少需要直接调用Close
。查看您的代码,您似乎希望将FormX显示为模态表单。也就是说,您希望用户使用表单,并在完成操作后点击OK按钮。然后读取Var
属性的值以获取用户输入的信息。在此场景中,您需要调用ShowDialog
而不是Show
。ShowDialog
调用只会在窗体关闭时返回。在ShowDialog
之后调用Close
没有效果,因为表单已经关闭。
总而言之,我认为你的代码应该是这样的:
public static string Open_form(string Var)
{
using (FormX Obj = new FormX())
{
Obj.Var = Var;
Obj.ShowDialog();
Obj.Process_Var();
return Obj.Var;
}
}
您的帖子中没有任何内容表明"多线程",也没有说明您的表单"同时运行"。因此,您的FormX.Var
值是可以的。