Form.Owner 从 .NET 3.5 中的单独线程设置

Posted

技术标签:

【中文标题】Form.Owner 从 .NET 3.5 中的单独线程设置【英文标题】:Form.Owner set from separate thread in .NET 3.5 【发布时间】:2011-07-06 20:49:10 【问题描述】:

我正在编写一个测试应用程序,我需要将表单放在单独的线程上。

因此,如果我从主线程创建表单窗口并设置其 .Owner = 这一切正常。 如果我生成线程 UIThread 并从新线程设置 Owner 我会得到异常。 获取异常是可以理解的,因为您无法直接访问表单。 我的问题是我需要在主线程上捕获一条消息并执行 BeginInvoke 以将其推送到它的消息泵上吗?由于 UIForm ShowInTaskbar 设置为 false,我需要单击任务栏中的主应用程序并恢复其所有子窗口。

private void UIThread() // New Thread call

        UIForm form = new UIForm();

        form.ShowInTaskbar = false;
        form.Owner = this;

        Application.Run(form); // Expected Exception

【问题讨论】:

你必须 pinvoke SetParent 才能解决这个问题。最好的办法是不要这样做。 【参考方案1】:

我不确定,也许每个应用程序只能调用 Application.Run 一次。看看这个是否适合你

Application.Run(new Form1());
-----------------
public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();

        var thread = new Thread(
            () =>
                
                    var form2 = new Form Owner = this;
                );
        thread.Start();
    

【讨论】:

以上是关于Form.Owner 从 .NET 3.5 中的单独线程设置的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net 3.5 中的 CORS

从 3.5 升级到 4 时 edmx 文件中的警告

如何将项目从 .NET 3.5 降级到 .NET 2.0?

从 Asp.Net 4 项目进入引用的 .Net 3.5 程序集

从 .NET 3.5 转换到 .NET 2.0

从 .Net 2 -> 3.5 SP1 WindowsForms:WindowsForms ControlDesigner / CollectionEditor 丢失?