简体   繁体   中英

progress bar not working with background worker

im using a background worker to merge 2 sqlite databases into 1 but i want to add a progress bar so users know when its done the background worker works fine but when i add code to report the progress the progress bar doesnt move any help is greatly appreciated heres the background worker code

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
        string str2 = "";
        if (saveFileDialog1.FileName != null)
        {
            str2 = saveFileDialog1.FileName;
            if (!File.Exists(str2))
            {
                SQLiteConnection.CreateFile(saveFileDialog1.FileName);
            }
        }

        SQLiteConnection connection = new SQLiteConnection("Data Source=" + saveFileDialog1.FileName);
        connection.Open();

        SQLiteCommand newcdbdatas = DatabaseHelper.CreateCommand("create table datas (id integer, ot integer, alias integer, setcode integer, type integer, atk integer, def integer, level integer, race integer, attribute integer, category integer)", connection);
        SQLiteCommand newcdbtexts = DatabaseHelper.CreateCommand("create table texts (id integer, name varchar(128), desc varchar(1024), str1 varchar(256), str2 varchar(256), str3 varchar(256), str4 varchar(256), str5 varchar(256), str6 varchar(256), str7 varchar(256), str8 varchar(256), str9 varchar(256), str10 varchar(256), str11 varchar(256), str12 varchar(256), str13 varchar(256), str14 varchar(256), str15 varchar(256), str16 varchar(256), str17 varchar(256), str18 varchar(256), str19 varchar(256))", connection);
        DatabaseHelper.ExecuteNonCommand(newcdbdatas);
        DatabaseHelper.ExecuteNonCommand(newcdbtexts);

        SQLiteCommand command = null;
            foreach (int id in Program.CardData1.Keys)
            {
                int cardid = Program.CardData1[id].Id;
                int ot = Program.CardData1[id].Ot;
                int cardalias = Program.CardData1[id].AliasId;
                int atk = Program.CardData1[id].Atk;
                int def = Program.CardData1[id].Def;

                command = DatabaseHelper.CreateCommand("INSERT INTO datas (id,ot,alias,setcode,type,atk,def,level,race,attribute,category)" +
                             " VALUES (@id, @ot, @alias, @setcode, @type, @atk, @def, @level, @race, @attribute, @category)", connection);

                command.Parameters.Add(new SQLiteParameter("@id", cardid));
                command.Parameters.Add(new SQLiteParameter("@ot", ot));
                command.Parameters.Add(new SQLiteParameter("@alias", cardalias));
                command.Parameters.Add(new SQLiteParameter("@setcode", Program.CardData1[id].SetCode));
                command.Parameters.Add(new SQLiteParameter("@type", Program.CardData1[id].Type));
                command.Parameters.Add(new SQLiteParameter("@atk", atk));
                command.Parameters.Add(new SQLiteParameter("@def", def));
                command.Parameters.Add(new SQLiteParameter("@level", Program.CardData1[id].Level));
                command.Parameters.Add(new SQLiteParameter("@race", Program.CardData1[id].Race));
                command.Parameters.Add(new SQLiteParameter("@attribute", Program.CardData1[id].Attribute));
                command.Parameters.Add(new SQLiteParameter("@category", Program.CardData1[id].Category));
                DatabaseHelper.ExecuteNonCommand(command);
                command = DatabaseHelper.CreateCommand("INSERT INTO texts (id,name,desc)" +
                    " VALUES (@id,@name,@des)", connection);
                command.Parameters.Add(new SQLiteParameter("@id", cardid));
                command.Parameters.Add(new SQLiteParameter("@name", Program.CardData1[id].Name));
                command.Parameters.Add(new SQLiteParameter("@des", Program.CardData1[id].Description));
                DatabaseHelper.ExecuteNonCommand(command);
            }
            connection.Close();
            backgroundWorker1.ReportProgress(i);
        }
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {

    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

I can't see the use of the for loop, the only value changed in every loop is i variable, and the only use of i is to report progress. So I think you don't actually need that for loop. Try to report progress using progressPercentage as in the following sample :

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    string str2 = "";
    if (saveFileDialog1.FileName != null)
    {
        str2 = saveFileDialog1.FileName;
        if (!File.Exists(str2))
        {
            SQLiteConnection.CreateFile(saveFileDialog1.FileName);
        }
    }

    SQLiteConnection connection = new SQLiteConnection("Data Source=" + saveFileDialog1.FileName);
    connection.Open();

    SQLiteCommand newcdbdatas = DatabaseHelper.CreateCommand("create table datas (id integer, ot integer, alias integer, setcode integer, type integer, atk integer, def integer, level integer, race integer, attribute integer, category integer)", connection);
    SQLiteCommand newcdbtexts = DatabaseHelper.CreateCommand("create table texts (id integer, name varchar(128), desc varchar(1024), str1 varchar(256), str2 varchar(256), str3 varchar(256), str4 varchar(256), str5 varchar(256), str6 varchar(256), str7 varchar(256), str8 varchar(256), str9 varchar(256), str10 varchar(256), str11 varchar(256), str12 varchar(256), str13 varchar(256), str14 varchar(256), str15 varchar(256), str16 varchar(256), str17 varchar(256), str18 varchar(256), str19 varchar(256))", connection);
    DatabaseHelper.ExecuteNonCommand(newcdbdatas);
    DatabaseHelper.ExecuteNonCommand(newcdbtexts);

    SQLiteCommand command = null;

    ///////I added somthing here//////////
    var progressCounter = 0;
    var max = Program.CardData1.Keys.Count;
    ///////////////////////////////////////

    foreach (int id in Program.CardData1.Keys)
    {
        int cardid = Program.CardData1[id].Id;
        int ot = Program.CardData1[id].Ot;
        int cardalias = Program.CardData1[id].AliasId;
        int atk = Program.CardData1[id].Atk;
        int def = Program.CardData1[id].Def;

        command = DatabaseHelper.CreateCommand("INSERT INTO datas (id,ot,alias,setcode,type,atk,def,level,race,attribute,category)" +
                     " VALUES (@id, @ot, @alias, @setcode, @type, @atk, @def, @level, @race, @attribute, @category)", connection);

        command.Parameters.Add(new SQLiteParameter("@id", cardid));
        command.Parameters.Add(new SQLiteParameter("@ot", ot));
        command.Parameters.Add(new SQLiteParameter("@alias", cardalias));
        command.Parameters.Add(new SQLiteParameter("@setcode", Program.CardData1[id].SetCode));
        command.Parameters.Add(new SQLiteParameter("@type", Program.CardData1[id].Type));
        command.Parameters.Add(new SQLiteParameter("@atk", atk));
        command.Parameters.Add(new SQLiteParameter("@def", def));
        command.Parameters.Add(new SQLiteParameter("@level", Program.CardData1[id].Level));
        command.Parameters.Add(new SQLiteParameter("@race", Program.CardData1[id].Race));
        command.Parameters.Add(new SQLiteParameter("@attribute", Program.CardData1[id].Attribute));
        command.Parameters.Add(new SQLiteParameter("@category", Program.CardData1[id].Category));
        DatabaseHelper.ExecuteNonCommand(command);
        command = DatabaseHelper.CreateCommand("INSERT INTO texts (id,name,desc)" +
            " VALUES (@id,@name,@des)", connection);
        command.Parameters.Add(new SQLiteParameter("@id", cardid));
        command.Parameters.Add(new SQLiteParameter("@name", Program.CardData1[id].Name));
        command.Parameters.Add(new SQLiteParameter("@des", Program.CardData1[id].Description));
        DatabaseHelper.ExecuteNonCommand(command);

        ///////I added somthing here//////////
        progressCounter++;
        var progressPercentage = progressCounter*100/max;
        backgroundWorker1.ReportProgress(progressPercentage);
        ///////////////////////////////////////
    }
    connection.Close();
}

You should be handling exceptions in your backgroundWorker1_RunWorkerCompleted event.

From BackgroundWorker.DoWork Event

If the operation raises an exception that your code does not handle, the BackgroundWorker catches the exception and passes it into the RunWorkerCompleted event handler, where it is exposed as the Error property of System.ComponentModel.RunWorkerCompletedEventArgs. If you are running under the Visual Studio debugger, the debugger will break at the point in the DoWork event handler where the unhandled exception was raised.

You should also have a look at RunWorkerCompletedEventArgs Class

The example provided is

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // First, handle the case where an exception was thrown.
    if (e.Error != null)
    {
        MessageBox.Show(e.Error.Message);
    }
    else if (e.Cancelled)
    {
        // Next, handle the case where the user canceled 
        // the operation.
        // Note that due to a race condition in 
        // the DoWork event handler, the Cancelled
        // flag may not have been set, even though
        // CancelAsync was called.
        resultLabel.Text = "Canceled";
    }
    else
    {
        // Finally, handle the case where the operation 
        // succeeded.
        resultLabel.Text = e.Result.ToString();
    }
}

确保您的BackgroundWorker的WorkerReportsProgress设置为true

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM