簡體   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