0

我需要生成一个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);
    }
}

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

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

4

2 回答 2

3

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

[STAThread]
static void Main()
{
    Task.Run(()=>
        {
            //do non-UI work here
            Thread.Sleep(30 * 1000);
        });
    Application.Run(new Form1());
}
于 2013-10-22T16:01:06.850 回答
1

您的代码不起作用,因为没有消息循环。您只需启动一个消息循环,UI 元素就可以正常工作。这意味着在某些时候您必须调用Application.Runor Form.ShowDialog

我看不出为什么您不能使用 UI 的入口点线程,然后创建一个工作线程来执行您希望在 UI 运行时发生的任何其他事情。

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

在评论中你写道:

主窗口像往常一样由应用程序运行。但是我需要像我在现有主窗口和没有它的情况下描述的那样生成一个窗口。

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

于 2013-10-22T16:04:27.303 回答