C# 从从不同窗体调用的静态类多次打开窗体

C# 从从不同窗体调用的静态类多次打开窗体,c#,class,static,static-methods,C#,Class,Static,Static Methods,如果我打开一个名为FormX的表单,它对其公共(非静态)变量“Var”进行一些处理。“Var”是从调用表单设置的,经过处理并返回以供输出。我在执行过程中多次从多个表单打开它。所有窗体都同时运行。它工作得很好,因为每个FormX都是使用一个独立于其父窗体的对象实例打开的。但我的项目中有一个公共静态类“Abc”,所有表单都可以访问它,如果我添加了代码: public static class Abc { public static string Open_form(string Var) {

如果我打开一个名为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和Form2从主窗体打开,如下所示:

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

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

那会不会有什么问题?如果两个窗体同时调用静态调用,那么在处理变量“Var”时会出现问题吗?还有一个问题,我应该调用
FormX.Dispose()
FormX.Close()之后为什么和为什么不?
FormX.Dispose()

如果
FormX.Var
是一个
静态属性或字段,那么是的,当多个线程或对象同时使用它时可能会出现问题。如果
FormX.Var
不是
static
,则不存在问题

经验法则:始终对实现
IDisposable
的任何对象调用
Dispose
。GC有一种方法可以为您调用它,但最好自己调用它。为了方便这一点,请使用C#的
关键字。下面的语法自动调用
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
值很好。

谢谢。“Var”不是静态的。我想将打开表单的通用代码从每个表单的代码转移到一个通用类,也许可以在每个表单的一行中调用它。Ok。我想将打开表单的通用代码从每个表单的代码转移到一个通用类,也许可以在每个表单的一行中调用该类。即使没有多线程,这里也存在一个潜在的问题。假设Ankit确实打算使用
Show
而不是
ShowDialog
以无模式方式显示这些表单。(我意识到上面的代码在
Show
调用之后有一个
Close
,这是有问题的,但假设他纠正了这一点。)在这种情况下,您可以同时打开多个表单,如果
FormX.Var
是静态的,那么即使是单线程的,也可能会产生影响。
    public static string Open_form(string Var)
    {
        using (FormX Obj = new FormX())
        {
            Obj.Var = Var;
            Obj.ShowDialog();
            Obj.Process_Var();
            return Obj.Var;
        }
    }