【问题标题】:.NET Are multiple instances of the same form sharing resources?.NET 是否同一表单的多个实例共享资源?
【发布时间】:2017-07-02 22:18:52
【问题描述】:

我正在创建一个项目,我在其中实例化多次相同的Form,其中包含一些Timers,很多背景工人,当然还有一些私有数组等等。

问题是……它不起作用。

我的意思是,我可以看到所有的表单,但 BWs 仅适用于第一个实例,而不适用于其他实例,即使 BW.isBusy() 返回 `false。 没有返回任何错误,他们只是不做他们应该做的事。

所以,我的问题是:某些 WinForm 组件,例如 BW,是否共享?

如果是,有办法绕过这个问题吗?
如果不是,这个问题的原因可能是什么?

抱歉,我无法向您显示源代码,甚至无法显示该软件的屏幕截图(它是为客户提供的)。
但是,如果您需要更多详细信息,我会分享。

以我正在使用的表单为例:

For (i = 0; i < 5; i++) {
     Form1 f = New Form1();
     f.Show();
}

提前感谢您的帮助。

【问题讨论】:

  • 你可能只是把static放在你不应该有的地方。
  • 找不到任何问题。
  • 您能告诉我们定时器和后台工作人员是如何初始化/创建的吗?
  • 我在表单的设计中创建了它们。但理论上,每次我实例化一个新的 Form1 时它们都应该被复制(如果我有一个按钮,两个 Form1 没有相同的按钮,理论上它没有任何意义)。我稍后会尝试在运行时实例化它们。
  • 表单不应共享任何私有资源/控件。 new Form1() 将始终创建新实例。仅当您使用 static/Shared 关键字声明控件时才能共享它们。如果控件不是静态的,那么您在初始化多个实例时会出现问题。某些初始化逻辑未正确执行。为了找到真正的问题 - 显示/告诉 BackgroundWorker 做什么以及如何检查它是否不起作用。如果您在BackgroundWorkers 之间共享了一些状态,那么在第一个实例启动后,其他工作人员可能会启动并立即完成

标签: .net forms winforms instance backgroundworker


【解决方案1】:

我为我的问题找到了一个“解决方法”。
我没有将 Form 实例化 N 次,而是使用我需要的参数启动 N 个单独的进程。

For (i = 0; i < 5; i++) {
  ProcessStartInfo pHelp = new ProcessStartInfo();
  pHelp.FileName = My.Application.Info.DirectoryPath + "\mySoft.exe";
  pHelp.Arguments = arg1 + "," + arg2 + "," + arg3;
  pHelp.UseShellExecute = true;
  pHelp.WindowStyle = ProcessWindowStyle.Normal;
  Process proc = Process.Start(pHelp);
}

然后在 Form_Load()

string[] args = Environment.GetCommandLineArgs();
// 
// Here code to split the args, which starts at index 1 of the array.
//
Form1 f = New Form1();
// 
// Here code to change some form variables.
// ex. f.Var1 = arg1;
//
f.Show();
Me.Close();

这不是最好的解决方案,但问题消失了,在我的情况下,可以有多个进程而不是多个表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多