繁体   English   中英

进度栏不能与后台工作者一起使用

[英]progress bar not working with background worker

即时通讯使用后台工作人员将2个sqlite数据库合并为1个,但是我想添加一个进度条,以便用户知道后台工作人员何时完成工作,但是当我添加代码以报告进度时,进度条不会移动任何帮助,我们将不胜感激这是后台工作人员代码

    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;
    }

我无法看到使用的for循环,每个循环中变更的唯一价值是i变量,唯一使用i的报告进度。 所以我认为您实际上不需要for循环。 尝试使用progressPercentage报告进度,如以下示例所示:

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();
}

您应该在backgroundWorker1_RunWorkerCompleted事件中处理异常。

来自BackgroundWorker.DoWork事件

如果该操作引发了代码无法处理的异常,则BackgroundWorker将捕获该异常并将其传递到RunWorkerCompleted事件处理程序,在该事件处理程序中将其公开为System.ComponentModel.RunWorkerCompletedEventArgs的Error属性。 如果您在Visual Studio调试器下运行,则调试器将在DoWork事件处理程序中引发未处理异常的点处中断。

您还应该看看RunWorkerCompletedEventArgs类

提供的示例是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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