打开表单时检查Winforms BackgroundWorker是否处于活动状态

时间:2017-02-02 02:20:11

标签: c# .net winforms

我目前有一个包含Main对象的SplitPanel表单。在左侧面板中,我有几个按钮,单击时,将在右侧面板中打开一个特定的表单。

其中一种形式Reports具有BackgroundWorkerbgLaborForecast),可以在数据库中进行大量数据库表维护和数据表构建,以便进行报告。当这个BackgroundWorker正在运行时,我只需点击Main表单左侧面板中的相应按钮即可导航到任何其他表单。完成BackGroundWorker后,无论我在应用程序中的哪个位置,它都会显示MessageBox

我要完成的是在加载BackgroundWorker表单时检查Reports是否正在运行。我试过了

if (bgLaborForecast.IsBusy) { 
    MessageBox.Show("Busy...");
}

但是当我输入表单时,.IsBusy状态始终为false。

如何在加载表单时检查进程处于活动状态?

1 个答案:

答案 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. 您可以设计更复杂的算法,在数组中存储创建的表单,在界面中添加额外的字段等。这个例子说明了基本原则:)