C# 在运行窗体中打开另一个窗体而不中断的执行!st表格

C# 在运行窗体中打开另一个窗体而不中断的执行!st表格,c#,multithreading,winforms,C#,Multithreading,Winforms,我有一个windows窗体应用程序,它应该在一个系统上执行多项任务,如拍摄桌面快照、查找可用磁盘空间、弹出消息、创建文件等 我的问题是,因为我有多个任务,其中一个是弹出消息,我想知道如何在不中断其他任务执行的情况下实现这一点。i、 e我有一个for循环,在这个循环中,所有任务都一个接一个地执行,当涉及到message任务时,它会等待Messagebox关闭,并且直到Messagebox关闭时才继续执行下一个任务 下面是代码片段: foreach (string str in Processque

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

我的问题是,因为我有多个任务,其中一个是弹出消息,我想知道如何在不中断其他任务执行的情况下实现这一点。i、 e我有一个for循环,在这个循环中,所有任务都一个接一个地执行,当涉及到message任务时,它会等待Messagebox关闭,并且直到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表单,该表单看起来像MessageBox,但可以像其他表单一样无模式显示


另一个解决方案是为每个表单创建一个单独的STA线程,并调用Application.Runform;在那条线上。您可以获得更好的分离—也就是说,只有同一线程上的窗体可以相互阻塞,如果每个窗体都有一个单独的线程,那么阻塞就不太可能发生。大量可能不必要的线程的主要缺点是,如果表单需要交互,则会有点棘手。

我不确定是否正确理解您的问题,但在深入研究多线程之前,如果您尚未研究多文档界面MDI Windows表单,则可以先看一看。一般来说,这允许您有一个父窗体和多个子窗体,并且可能您可以为要执行的每个任务使用不同的子窗体。我不确定这是否会对你有帮助,但我想如果你快速看一看可能会有所帮助。好的,我会看一看MDI。我不认为MDI会有多大帮助,除非子窗口不共享相同的UI线程。只是澄清一下,我没有针对每个任务的多个表单。它只用于消息任务我需要一个单独的表单或一个不会中断其他任务的消息框。我知道你没有要求它,但我可以谦虚地在这里做一个小的代码审查吗?我建议您用适当的多态性替换整个开关块:即,在ProcessQueue类上定义类似于Run的方法,然后在ProcessQueue{process.Run;}2中执行foreach var进程。考虑重命名进程队列来处理。ProcessQueue中的foreach ProcessQueue进程听起来不符合逻辑IMHO:为什么类型名为ProcessQueue,而变量为process?为什么可以迭代processQueue并再次检索processQueue对象呢;不要从不同的线程开始,这比它的价值要麻烦得多,当然,如果你不了解多线程的细节。hi@stakx,你的解决方案工作得很好,直到我使用定时器完成所有任务。请参阅我现在需要使用多线程吗?@user1650891:我不打算回答其他页面上提出的问题。我只是回答你的问题。但是稍后我可能会看一看你的另一个问题。@user1650891:但是我会在回答你上面的评论时说,计时器问题可能是由于你的计时器在后台线程上触发的。由于Windows窗体不允许对UI元素进行跨线程访问,为了对UI执行任何操作,您需要首先返回UI线程并在那里执行与UI相关的代码,例如,使用someControlOrForm.Invoke…。