我目前有一个包含Main
对象的SplitPanel
表单。在左侧面板中,我有几个按钮,单击时,将在右侧面板中打开一个特定的表单。
其中一种形式Reports
具有BackgroundWorker
(bgLaborForecast
),可以在数据库中进行大量数据库表维护和数据表构建,以便进行报告。当这个BackgroundWorker
正在运行时,我只需点击Main
表单左侧面板中的相应按钮即可导航到任何其他表单。完成BackGroundWorker
后,无论我在应用程序中的哪个位置,它都会显示MessageBox
。
我要完成的是在加载BackgroundWorker
表单时检查Reports
是否正在运行。我试过了
if (bgLaborForecast.IsBusy) {
MessageBox.Show("Busy...");
}
但是当我输入表单时,.IsBusy
状态始终为false。
如何在加载表单时检查进程处于活动状态?
答案 0 :(得分:0)
你需要做界面
public interface IState
{
bool BgWorkerIsWorking { get; set; }
}
然后在Form1中实现它:
public partial class Form1 : Form, IState
...
private bool _working;
public bool BgWorkerIsWorking
{
get { return _working; }
set { _working = value; }
}
在MainForm中声明变量以保持形式
Form firstForm;
按下按钮
if (first == null)// If form wasn't created
{
first = new Form2();// Create form and show
first.Show();
}
else// If form was created
{
var check = first as IState;// Use form as our interface
if (check.BgWorkerIsWorking)// And check state
{
// Here you do something.
}
}
最后在BgWorker活动的Form1中你做了这个
private void Bg_DoWork(object sender, DoWorkEventArgs e)
{
_working = true;
// Here is your code
}
private void Bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
_working = false;
}
当然,你的工人初始化必须是这个
using (BackgroundWorker bg = new BackgroundWorker())
{
bg.DoWork += Bg_DoWork;
bg.RunWorkerCompleted += Bg_RunWorkerCompleted;
}
以防万一,工人在
之后开始工作bg.RunWorkerAsync();
P.S。
必须为您创建的每个表单重复此步骤。声明secondForm,thirdForm等。
P.P.S.
您可以设计更复杂的算法,在数组中存储创建的表单,在界面中添加额外的字段等。这个例子说明了基本原则:)