【问题标题】:Issues of creating a new form创建新表单的问题
【发布时间】:2009-07-19 17:32:30
【问题描述】:

在 Form1 的按钮单击偶数处理程序中,我想创建 Form2。这是我的代码,

Form1 的 button1 的偶数处理程序

// button1 belongs to Form1
private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2("www.google.com");
    form2.ShowDialog();
}

Form2 构造函数

public Form2 (string str)
{
    InitializeComponent();
    address = str;
    button2.Text = str; // button2 belongs to Form2
}

public Form2()
{
    InitializeComponent();
}

我的问题和担忧是,按钮 1 事件处理程序由 Form1 的 UI 线程执行,如果我在 Form1 UI 线程内创建新的 Form2,并使用 UI 线程设置 Form2 的 UI 元素(button2.Text),是合法的?我的理解是每个表单都有它的所有者 UI 线程和 UI 元素(例如按钮)应该只由表单单独的所有者线程处理?如果我的代码有误,如果有人能告诉我在当前表单的事件处理程序中创建另一个表单并传递参数的优雅方法,我们将不胜感激。

我正在使用 VSTS 2008 + C# + .Net 2.0。

【问题讨论】:

    标签: c# .net winforms visual-studio-2008


    【解决方案1】:

    您的代码非常好。两种形式将存在于同一个线程中,并且可以相互访问而无需担心线程。在这种情况下,除非您明确说明,否则不会产生新线程。

    作为旁注,我想稍微改变一下Form2 的构造函数。我假设Form2 也有没有参数的默认构造函数,并且该构造函数也调用InitializeComponent?如果是这样,则无需在构造函数中复制该调用;如果你像这样设置它,它将首先运行默认构造函数,然后添加你的自定义内容:

    public Form2 (string str) : this()
    {
        address = str;
        button2.Text = str; // button2 belongs to Form2
    }
    

    【讨论】:

    • 感谢 Fredrik,我已经发布了我的另一个 Form2 构造函数,它只有一行代码来调用 InitializeComponent。与您的代码相比,我的代码是否存在任何功能错误(如果我只是保留我的代码现在在我的原始帖子中显示的样子)?
    • 不,代码没有错误或技术上的错误。这只是一个问题或避免不同地方的代码做同样的事情;删除冗余,仅此而已。
    • 这是否意味着无论我创建多少个窗体,在一个 Windows 窗体应用程序中,所有窗体都将共享同一个 UI 线程?
    • 是的,这是正确的(如下所示 Tormod Fjeldskår)。表单的数量不是一个因素,一切都发生在同一个线程上。
    • 为构造函数提及: this 使这个答案完美!
    【解决方案2】:

    在 Winforms 中,应用程序中的所有 UI 元素共享同一个 UI 线程。所以请放心,从这个意义上说,您的代码没有任何问题。

    【讨论】:

    • 你的意思是无论我创建多少个Forms,它们都将共享同一个UI线程?
    • 没错。属于同一个应用程序的所有表单将共享同一个 UI 线程。
    【解决方案3】:

    这是合法的,应该可以正常工作。

    【讨论】:

    • 我想知道无论我创建多少个Forms,它们都将共享同一个UI线程?
    【解决方案4】:

    第二个表单将使用与form1相同的线程

    【讨论】:

    • 这是否意味着无论我创建多少个窗体,在一个 Windows 窗体应用程序中,所有窗体都将共享同一个 UI 线程?
    • 是的。新表单在另一个线程上的唯一方法是使用另一个线程创建表单。
    【解决方案5】:

    您的代码是完全合法的 :-) 文档只说任何 UI 控件只能从创建它的线程访问。

    【讨论】:

    • 这是否意味着无论我创建多少个窗体,在一个 Windows 窗体应用程序中,所有窗体都将共享同一个 UI 线程?
    • 正如 mliesen 所说“所有表单都将在同一个线程上运行,(除非您启动一个新线程并在此线程中创建表单)。”
    【解决方案6】:

    所有表单都将在同一个线程上运行,(除非您启动一个新线程并在该线程中创建表单)。

    【讨论】:

    • 这是否意味着无论我创建多少个窗体,在一个 Windows 窗体应用程序中,所有窗体都将共享同一个 UI 线程?
    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2021-11-15
    相关资源
    最近更新 更多