.net - 如何在线程中打开表单并强制其保持打开状态

标签 .net winforms multithreading

在弄清楚如何在我讨论了here的单独的UI线程中创建winform时,我仍然遇到问题。

为了弄清楚这一点,我编写了以下简单的测试程序。我只是希望它在名为“UI线程”的单独线程上打开表单,并在该表单处于打开状态的同时保持该线程运行,同时允许用户与该表单进行交互(旋转是作弊行为)。我了解为什么下面的操作失败并且线程立即关闭,但不确定如何解决该问题。

using System;
using System.Windows.Forms;
using System.Threading;

namespace UIThreadMarshalling {
    static class Program {
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var tt = new ThreadTest();
            ThreadStart ts = new ThreadStart(tt.StartUiThread);
            Thread t = new Thread(ts);
            t.Name = "UI Thread";
            t.Start();
            Thread.Sleep(new TimeSpan(0, 0, 10));
        }

    }

    public class ThreadTest {
        Form _form;
        public ThreadTest() {
        }

        public void StartUiThread() {
            _form = new Form1();
            _form.Show();
        }
    }
}

最佳答案

在新线程上,调用传递窗体对象的Application.Run,​​这将使线程在窗口打开时运行其自己的消息循环。

然后,您可以在该线程上调用.Join以使您的主线程等待直到UI线程终止,或者使用类似的技巧来等待该线程完成。

例子:

public void StartUiThread()
{
    using (Form1 _form = new Form1())
    {
        Application.Run(_form);
    }
}

关于.net - 如何在线程中打开表单并强制其保持打开状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/167323/

相关文章:

c# - 将 future 的本地日期时间转换为 UTC

c# - 如何更新到 .NETStandard 2.0 NuGet 包

c# - C# 中的调用和委托(delegate)

c - 何时使用 QueueUserAPC()?

c#如何在启动另一个线程之前检查一个线程是否完成

c - 试图理解彼得森的算法

c# - 登录网站并检索数据

C# 和不可变性和只读字段……谎言?

c# - 使windows窗体富编辑文本框以xml格式显示文本

c# - 在 C# Windows 窗体中通过 IE 浏览器传递 AD 身份验证凭据