Problem progress bar run till my process complete (Loading a file in database)

177 views Asked by At

I want to make this progress on moment of Importing data to database when I click on button SUBMIT I want to have the result of progress online on the moment of importing data not after waiting the moment of import data

I try to make methode work in many times but I get error here bgw.RunWorkerAsync()

public ImportAvancement()
{
    InitializeComponent();
    label11.Text = "";
    label12.Text = "";
}
BackgroundWorker bgw = new BackgroundWorker();    
DataSet dataset;
private void ImportAvancement_Load(object sender, EventArgs e)
{
    label2.Visible = false;
    label3.Visible = false;
    label4.Visible = false;
    label5.Visible = false;
    label6.Visible = false;
    label7.Visible = false;
    label8.Visible = false;
    label9.Visible = false;
    label10.Visible = false;

    dataset= Models.Loadcombo.LoadComboEFP();
    comboBox1.DisplayMember = "nom_Etab";
    comboBox1.ValueMember = "nom_Etab";
    comboBox1.DataSource = dataset.Tables["TEFP"];
}
OpenFileDialog open = new OpenFileDialog();
private void button1_Click(object sender, EventArgs e)
{
    open.ShowDialog();
}
int VALueSector = 0;

int ValueLevel = 0;
int ValueAffilate = 0;

public void work()
{
    bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
    bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
    bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
    bgw.WorkerReportsProgress = true;
    bgw.RunWorkerAsync();
}
private void SUBMIT_Click(object sender, EventArgs e)
{
    TotalValue = 0;

    VALueSector = Controller.MethodeImportation.ImportSector(open.FileName);
     TotalValue += VALueSector;
    if (VALueSector == 0)
    {
        label2.Text = "The SECTORS  ALREADY EXIST";
    }
    else
    {
        label2.Text = ("" + VALueSector.ToString() + " new Sector have been imported");

    }

    ValueLevel = Controller.MethodeImportation.ImportLevel(open.FileName);
    TotalValue += ValueLevel;
    if (ValeurEFPSECTEUR == 0)
    {
        label4.Text = "The Levels are already Exist";
    }
    else
    {
        label4.Text = ("" + ValueLevel.ToString() + " new levels Have been imported");
    }

    ValueAffilate = Controller.MethodeImportation.ImportAffilate(open.FileName);
     TotalValue += ValueAffilate;
    if (ValueAffilate== 0)
    {
        label5.Text = "The Affilate already Exist";
    }
    else
    {
        label5.Text = ("" + ValueAffilate.ToString() + " New Affilate Have been imported");
    }

    work();
}
void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    progressBarX1.Visible = false;
    label2.Visible = true;
    label3.Visible = true;
    label4.Visible = true;
    label5.Visible = true;
    label6.Visible = true;
    label7.Visible = true;
    label8.Visible = true;
    label9.Visible = true;
    label10.Visible = true;
}

void bgw_DoWork(object sender, DoWorkEventArgs e)
{
   if (totalValue == 0)
   {
       bgw.ReportProgress(0, 0);
   }
   else
   {
       for (int i = 0; i <= totalValue; i++) //some number (total)
       {
           System.Threading.Thread.Sleep(100);
           int percents = (i * 100) / totalValue;
           bgw.ReportProgress(percents, i);
       }
   }
}
void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBarX1.Value = e.ProgressPercentage;
    label11.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
    label12.Text = String.Format("Total items transfered: {0}", e.UserState);
}

so when I try to make like what I want make my method in many times to get a dynamic Total value like this code:

private void SUBMIT_Click(object sender, EventArgs e)
{
    TotalValue = 0;

    VALueSector = Controller.MethodeImportation.ImportSector(open.FileName);
     TotalValue += VALueSector;
    if (VALueSector == 0)
    {
        label2.Text = "The SECTORS  ALREADY EXIST";
    }
    else
    {
        label2.Text = ("" + VALueSector.ToString() + " new Sector have been imported");
    }

    work();

    ValueLevel = Controller.MethodeImportation.ImportLevel(open.FileName);
    TotalValue += ValueLevel;
    if (ValeurEFPSECTEUR == 0)
    {
        label4.Text = "The Levels are already Exist";
    }
    else
    {
        label4.Text = ("" + ValueLevel.ToString() + " new levels Have been imported");
    }

    work();
    ValueAffilate = Controller.MethodeImportation.ImportAffilate(open.FileName);
     TotalValue += ValueAffilate;
    if (ValueAffilate== 0)
    {
        label5.Text = "The Affilate already Exist";
    }
    else
    {
        label5.Text = ("" + ValueAffilate.ToString() + " New Affilate Have been imported");
    }

    work();
}

Finally I get this error:

BackgroundWorker is currently busy and can not run multiple tasks simultaneously.

I work with ado.net mode connect so it take time when I import data I want this time wasted and that he will be in progress bar and in the same time of calculate total the current total not after calculate the final total

I have edited my method like this there is no error but it is blocked

public void work()
{
    bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
    bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
    bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
    bgw.WorkerReportsProgress = true;
    bgw.RunWorkerAsync();
    while (this.bgw.IsBusy)
    {
        progressBarX1.Increment(1);
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
        // Keep UI messages moving, so the form remains
        // responsive during the asynchronous operation.
        Application.DoEvents();
    }
}
0

There are 0 answers