将表单粘贴在另一个运行在不同线程中的表单上

时间:2013-02-26 08:57:46

标签: c# multithreading winforms

我有一个信息表单,显示有关某些进程状态的信息。此表单显示在主表单上,其中用户提供进程执行的指令。现在,我在另一个线程上运行此信息表单,无法将其粘贴在主窗体的顶部。每当我点击任务栏右下角的显示桌面按钮,然后尝试从任务栏恢复我的应用程序时,信息表单就不可见了。如何使此信息表格保持坚持主表格?

3 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:0)

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

查看Multithreading in Windows Forms

请记住,winforms控件是not thread-safe

  

对Windows窗体控件的访问本质上不是线程安全的。如果你   有两个或多个线程来操纵控件的状态,它是   可能迫使控件进入不一致状态。其他   线程相关的错误也是可能的,包括竞争条件   和死锁。确保访问您的控件非常重要   以线程安全的方式完成。

答案 2 :(得分:0)

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

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