-1

如果我打开一个名为 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"));
}

Form1 和 Form2 从主窗体打开,如下所示:

Form1 obj1 = new Form1();
obj1.Show();

Form2 obj2 = new Form2();
obj2.Show();

那么会不会有什么问题呢?如果两个表单同时调用静态调用,对变量“Var”的处理会不会有问题?还有一个问题,我应该在WhyFormX.Dispose();之后打电话FormX.Close();,为什么不打电话?有什么好处FormX.Dispose()吗?

4

2 回答 2

2

如果FormX.Varstatic属性或字段,那么是的,当它被多个线程或对象同时使用时可能会出现问题。如果FormX.Var不是static,那么不,应该没有问题。

经验法则:始终调用Dispose任何实现IDisposable. GC 可以为您调用它,但最好自己调用它。为此,请使用 C# 的using关键字。下面的语法自动调用Dispose.

using (FormX Obj = new FormX())
{
    ...
}

你很少需要Close直接打电话。查看您的代码,您似乎希望将 FormX 显示为模式表单。也就是说,您希望用户使用表单,并在完成后点击 OK 按钮。然后,您正在读取Var属性的值以获取用户输入的信息。在这种情况下,您需要调用ShowDialog而不是Show. 仅当ShowDialog表单关闭时调用才会返回。调用CloseafterShowDialog无效,因为表单已经关闭。

总而言之,我相信您的代码应该如下所示:

    public static string Open_form(string Var)
    {
        using (FormX Obj = new FormX())
        {
            Obj.Var = Var;
            Obj.ShowDialog();
            Obj.Process_Var();
            return Obj.Var;
        }
    }
于 2013-06-17T15:01:23.420 回答
1

您的帖子中没有任何内容表明“多线程”,也没有表明您的表单“正在同时运行”。因此,你FormX.Var的价值是好的。

于 2013-06-17T15:10:40.593 回答