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