在正在运行的表单中打开一个不同的表单,而不中断表单的执行

本文关键字:表单 一个 执行 中断 运行 | 更新日期: 2023-09-27 18:11:12

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

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

下面是代码片段:
foreach (string str in Processqueue)
{
    switch (str)
    {
        case "DISKSPACE": DiskSpace();
            break;
        case "MESSAGE": Message();
            break;
        case "SCREENSHOT": Screenshot();
            break;
    }
}

这里Processqueue是字符串数组。

我做了一些研究,似乎我需要使用不同的线程。我是Winform新手,有谁能帮我一下吗?

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

在正在运行的表单中打开一个不同的表单,而不中断表单的执行

一个非常简单的解决方案是显示表单的非模态而不是模态。即不呼叫form.ShowDialog(),呼叫form.Show()

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

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