在运行的表单中打开不同的表单而不中断 !st 表单的执行

Posted

技术标签:

【中文标题】在运行的表单中打开不同的表单而不中断 !st 表单的执行【英文标题】:Opening a different form inside running form without interrupting execution of the !st form 【发布时间】:2014-07-03 10:14:09 【问题描述】:

我有一个 Windows 窗体应用程序,它应该在系统上执行多项任务,例如拍摄桌面快照、查找可用磁盘空间、弹出消息、创建文件等等。

我的问题是,由于我有多个任务,其中一个正在弹出消息,我想知道如何在不中断其他任务执行的情况下实现这一目标。即我有 for 循环,其中所有任务都被一个接一个地执行,当涉及到消息任务时,它等待消息框关闭,并且除非消息框关闭,否则不会继续执行下一个任务。

这里是代码sn-p:

foreach (string str in Processqueue)

    switch (str)
    
        case "DISKSPACE": DiskSpace();
            break;

        case "MESSAGE": Message();
            break;

        case "SCREENSHOT": Screenshot();
            break;

    

这里的Processqueue是字符串数组。

做了一些研究,看来我需要为此使用不同的线程。我是Winform的新手,谁能帮忙。

我不需要在现有表单中打开新表单。我需要打开新表单(仅用于消息任务)并在后台在主表单上执行其他剩余任务。

【问题讨论】:

我不确定我是否正确理解了您的问题,但在深入研究多线程之前,您可以查看(如果您还没有)Multiple-Document Interface (MDI) Windows Forms。一般来说,这允许您拥有一个parent form 和多个child forms,也许您可​​以为每个要执行的任务使用不同的child form。不确定这是否会对您有所帮助,但我认为如果您快速浏览一下可能会有所帮助。 好,我去看看MDI。 我认为 MDI 不会有太大帮助,除非子窗口不共享相同的 UI 线程。 只是为了澄清我没有针对每个任务的多个表单。它仅用于消息任务,我需要一个单独的表单或一个不会中断其他任务的消息框。 离题:1. 我知道你没有要求,但我可以在这里谦虚地做一个小小的代码审查吗?我建议您用适当的多态性替换整个 switch 块:即在您的 ProcessQueue 类上定义类似 Run 的方法,然后只执行 foreach (var process in processQueue) process.Run(); 2. 考虑重命名 @ 987654330@ 至Processforeach (ProcessQueue process in processQueue) 听起来不合逻辑恕我直言:为什么类型称为ProcessQueue,而变量process?为什么你可以遍历 processQueue 并再次检索 ProcessQueue 对象? 【参考方案1】:

一个非常简单的解决方案是显示您的表单无模式而不是模态。也就是说,不要调用form.ShowDialog(),而是调用form.Show()

但是,此解决方案意味着您不能使用System.Windows.Forms.MessageBox.Show(…),因为这些消息框始终是模态的。您必须创建自己的消息框表单,看起来像 MessageBox(但可以像其他 Forms 一样显示为无模式)。

另一个解决方案确实是为每个表单创建一个单独的 STA 线程,并在该线程上调用 Application.Run(form);。你得到了更好的分离——也就是说,只有同一个线程上的表单可以互相阻塞,如果每个表单都有一个单独的线程,阻塞是不太可能发生的。主要缺点(除了许多可能不必要的线程)是如果您的表单需要交互,它会有点棘手。

【讨论】:

在OP处:使用第一种方法(form.Show());不要从不同的线程开始,这比它的价值要麻烦得多,当然如果你不了解多线程的细节。 嗨@stakx,您的解决方案运行良好,直到我使用计时器完成所有任务。请参考link我现在需要使用多线程吗? @user1650891:我不会在这里回答已经在其他页面上提出的问题。我在这里只回答你在这里问的问题。但我稍后可能会看看你的另一个问题。 @user1650891:但我会在回复您上面的评论时说,计时器问题可能是由于您的计时器在后台线程上触发。因为 Windows 窗体不允许跨线程访问 UI 元素,所以为了对 UI 执行任何操作,您需要先返回 UI 线程并在那里执行与 UI 相关的代码,例如使用someControlOrForm.Invoke(…)

以上是关于在运行的表单中打开不同的表单而不中断 !st 表单的执行的主要内容,如果未能解决你的问题,请参考以下文章

使用 vba 在 Access 2010 中使用不同表单的 ID 打开表单

如何打开一个新表单然后从第二个表单返回到第一个表单而不关闭并重新打开第一个表单

使用会话值设置表单数据而不提交此 symfony 表单

在浏览器中刷新页面而不重新提交表单

如何在Outlook中使用OLE在前面(而不是在背景上)显示新的电子邮件表单?

ASP.NET MVC 表单身份验证域属性在 Firefox 中中断登录