从从不同表单调用的静态类中多次打开表单

本文关键字:表单 调用 静态类 | 更新日期: 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.Varstatic属性或字段,那么是的,当多个线程或对象同时使用它时可能会出现问题。如果FormX.Var不是static,那么没有,应该没有问题。

经验法则:总是在任何实现IDisposable的对象上调用Dispose。GC有一种方法可以为您调用它,但最好的做法是自己调用它。为了方便起见,可以使用c#的using关键字。下面的语法自动调用Dispose
using (FormX Obj = new FormX())
{
    ...
}

你很少需要直接调用Close。查看您的代码,您似乎希望将FormX显示为模态表单。也就是说,您希望用户使用表单,并在完成操作后点击OK按钮。然后读取Var属性的值以获取用户输入的信息。在此场景中,您需要调用ShowDialog而不是ShowShowDialog调用只会在窗体关闭时返回。在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值是可以的。