0

我有一个信息表单,它显示有关某些进程状态的信息。此表单显示在用户给出流程执行指令的主表单上。现在,我在另一个线程上运行此信息表单,无法将其粘贴在主表单之上。每当我单击任务栏右下角的显示桌面按钮,然后尝试从任务栏恢复我的应用程序时,信息表单都不可见。我怎样才能让这个信息表单保持在主表单上?

4

3 回答 3

1

我不确定这是否是一种干净的方式,但它确实有效!

    private void Form1_Load(object sender, EventArgs e)
    {
        this.Resize += OnResize;
    }

    private void OnResize(object sender, EventArgs eventArgs)
    {
        if (form2running && form != null && (WindowState == FormWindowState.Maximized || WindowState == FormWindowState.Normal))
        {
            form.Invoke((MethodInvoker)(() => form.WindowState = FormWindowState.Normal));
        }
    }


    private bool form2running = false;
    private Form form;

    private void button2_Click(object sender, EventArgs e)
    {
        ThreadPool.QueueUserWorkItem(ShowNewForm);
    }

    private void ShowNewForm(object o)
    {
        form2running = true;
        form = new Form2();
        Application.Run(form);
        form2running = false;
    }
于 2013-02-26T10:01:18.390 回答
0

所有形式的应用程序都应该在单个 UI 线程上运行。如果您想在后台执行某些操作,请使用后台线程(例如通过BackgroundWorker )。当新数据从后台线程到达时,只需刷新信息表单的 UI。

查看Windows 窗体中的多线程

请记住,winforms 控件不是线程安全的

对 Windows 窗体控件的访问本质上不是线程安全的。如果您有两个或更多线程操作控件的状态,则可能会强制控件进入不一致的状态。其他与线程相关的错误也是可能的,包括竞争条件和死锁。确保以线程安全的方式访问控件很重要。

于 2013-02-26T09:02:45.910 回答
0

您可以创建信息表单并在单独的线程中对其进行初始化,但是您必须在主线程中显示它。您通常不能在不同线程中运行的两个表单之间进行操作。

考虑使用BackgroundWorker 类来执行您的任务。

于 2013-02-26T09:12:23.837 回答