我有一个信息表单,它显示有关某些进程状态的信息。此表单显示在用户给出流程执行指令的主表单上。现在,我在另一个线程上运行此信息表单,无法将其粘贴在主表单之上。每当我单击任务栏右下角的显示桌面按钮,然后尝试从任务栏恢复我的应用程序时,信息表单都不可见。我怎样才能让这个信息表单保持在主表单上?
问问题
144 次
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。
请记住,winforms 控件不是线程安全的:
对 Windows 窗体控件的访问本质上不是线程安全的。如果您有两个或更多线程操作控件的状态,则可能会强制控件进入不一致的状态。其他与线程相关的错误也是可能的,包括竞争条件和死锁。确保以线程安全的方式访问控件很重要。
于 2013-02-26T09:02:45.910 回答
0
您可以创建信息表单并在单独的线程中对其进行初始化,但是您必须在主线程中显示它。您通常不能在不同线程中运行的两个表单之间进行操作。
考虑使用BackgroundWorker 类来执行您的任务。
于 2013-02-26T09:12:23.837 回答