【问题标题】:Display a form in a console application at a particular point(in the middle of execution)在特定点(执行过程中)在控制台应用程序中显示表单
【发布时间】:2011-04-27 13:21:18
【问题描述】:

我想在控制台应用程序中间显示一个表单,以显示一些状态信息,并在发生特定事件时自动关闭该表单。以下代码部分是否足以满足此目的?

显示表单

ModuleInitializerForm moduleInitializerDlg = new ModuleInitializerForm()
{
  Parent = parent,
  TopMost = true,
  TopLevel = true,
  Text = Common.MESSAGE_INFO_TITLE,
  ControlBox = false,
  FormBorderStyle = FormBorderStyle.FixedDialog,
  KeyPreview = false,
};

moduleInitializerDlg.Initialize();
moduleInitializerDlg.ShowDialog(); 

关闭表单

public void OnModuleInitializationCompleted(object sender, EventArgs e)
  {
    if (this.InvokeRequired)
    {
      this.BeginInvoke(new ECEventsHandler(OnModuleInitializationCompleted), sender, e);
    }
    else
    {
      this.Close();
    }
  }

【问题讨论】:

  • 您是在自己的线程上运行表单吗?
  • 我不明白这个问题。我错过了什么吗?
  • @Maanu:(扩展 Lasse 评论)使用 ShowDialog 的问题是线程的执行被阻塞,直到表单关闭。因此,如果您只有一个线程,则该表单将永远不会被同一线程中触发的事件关闭...
  • @digEmAll: ShowDialog 将从一个线程调用,OnModuleInitializationCompleted 将由一个线程池线程调用
  • @Jodrell 在托管代码中没有真正的“控制台应用程序”。相反,“控制台应用程序”可以写入控制台并显示 Winforms/WPF 窗口(如果它想要并且已经引用了正确的程序集)。不同之处在于,如果您选择“控制台应用程序”作为输出,则始终显示控制台,即如果应用程序未从控制台启动,则会打开它。

标签: c# winforms


【解决方案1】:

由于您使用的是 ShowDialog(),执行此操作的线程将被阻塞,直到用户(或您)关闭表单。

请注意,如果您改用 Show(),则线程将继续。但是,如果您没有人在该线程上发送 Windows 消息,则表单将“死”,即它不会响应任何内容。如果您从一个普通的控制台应用程序项目开始,那么就是这种情况。如果您使用 ShowDialog(),它会创建一个本地消息循环,以便窗口响应。

因此,您需要为显示表单的 Windows 窗体 UI 设置一个单独的线程。我会使用Application.Run(moduleInitializerDlg); 而不是 ShowDialog(),因为据我所知,它可以更好地设置/拆除消息泵架构。顺便说一下,该调用会以与 ShowDialog() 相同的方式阻塞线程。

【讨论】:

  • 可以在调用 Application.Run() 之前启动您的工作线程,但如果表单尚未显示,请确保处理程序仍然有效。
【解决方案2】:

转到应在单击时打开的表单的属性... 转到布局部分并将开始位置放置到 Centerscreen,或者如果您有一个父级,您每次都想停靠它,请使用 CenterParent...

享受吧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2016-02-05
    • 1970-01-01
    • 2011-11-19
    • 2021-04-03
    相关资源
    最近更新 更多