如何生成表单而不是阻塞主线程?

时间:2013-10-22 15:39:34

标签: c# multithreading winforms

我需要生成一个可以像往常一样使用的Form但是主线程必须继续做它之后正在做的事情。当我尝试下面的两种技术时,我无法使用表格:

static class Program
{
    private static void spawnForm1()
    {
        new Form1().Show();
    }

    private static void spawnForm2()
    {
        // solved: use ShowDialog() instead of Show() here
        ThreadPool.QueueUserWorkItem(o => { new Form1().Show(); });
    }

    [STAThread]
    static void Main()
    {
        spawnForm1();
        MessageBox.Show("main thread continues");
        // now anything can happen: background processing or start of main form
        // sleeping is just an example for how the form is unresponsive
        Thread.Sleep(30 * 1000);
    }
}

那么如何在主线程中生成一个简单的Form并继续?它应该像消息框一样响应。

(我不能使用Application.Run(...);而且我不能使用ShowDialog()如果它会阻止主线程,还有:对不起,我没有太多的声誉,但是这个这不是一个菜鸟问题,我真的需要它像我试图解释一样产生)

2 个答案:

答案 0 :(得分:3)

不要创建新线程来显示UI。你在UI线程中,它应该是显示表单的线程。生成一个新线程来执行您想要执行的非UI工作:

[STAThread]
static void Main()
{
    Task.Run(()=>
        {
            //do non-UI work here
            Thread.Sleep(30 * 1000);
        });
    Application.Run(new Form1());
}

答案 1 :(得分:1)

您的代码无效,因为没有消息循环。您只需启动消息循环以使UI元素正常运行。这意味着您必须在某个时候致电Application.RunForm.ShowDialog

我认为没有理由不能为UI使用入口点线程,然后创建一个工作线程来执行在UI运行时你想要发生的任何其他事情。

[STAThread]
public static void Main()
{
  Task.Run(() => DoOtherStuff());
  Application.Run(new YourForm());
}

在你写的评论中写道:

  

主窗口像应用程序一样运行。但我需要产卵   像我在两个情境现有的主窗口中描述的窗口   而且没有它。

我假设您要在入口点线程和单独的线程上运行Form个实例。我的建议是避免这样做。它不能很好地工作。可能会发生许多奇怪的事情。重新思考您的设计,以便只有一个UI线程。将任何耗时的操作移动到工作线程。