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