后台工作在Foreach功能中不起作用?

时间:2013-12-27 00:29:02

标签: c# multithreading foreach progress-bar backgroundworker

我的应用会向CheckedListBox中的选定群组发送消息。我希望在程序发送消息时使用Progressbar

foreach (object item in checkedListBox1.CheckedItems) 
{
    if (item.ToString() == gi.name)             //don't read
    {
        if (txtBoxPath.Text == string.Empty)    //don't read
        {
            try
            {
                Dictionary<string, object> args = new Dictionary<string, object>();
                args["message"] = txtBoxStatus.Text;
                fb.Post(gi.id + "/feed", args);

                sCount = checkedListBox1.CheckedItems.Count;
                for (int i = 0; i < sCount; i++)
                {
                    backgroundWrkSendPOST.ReportProgress(100 / sCount); //****HERE****
                }
            }
            catch (FacebookApiException ex)
            {
                MessageBox.Show("ERRO:" + Environment.NewLine + ex.Message, "ERRO", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        else
        {
            .......

其中:sCount(int):表示已检查列表框中已检查项目的数量。 因此,遵循数学规则,对于选择的每个项目{y}(foreach函数中的项目)应该为100%/ {y}复制,这意味着最终应该是100%。但似乎foreach函数没有读取后台工作,也没有多重。

我们调试时的输出:

有人能帮助我吗?最后,此进度条应保持100%。

1 个答案:

答案 0 :(得分:1)

如果我说得对,你检查了2个项目(sCount=2),并且循环两次(i<sCount)并使用相同的值(100/2)调用ReportProgress

输出始终为50,因此ProgressBar始终显示50

也就不足为奇了

我会尝试以这种方式更改您的代码

sCount = checkedListBox1.CheckedItems.Count;
// Supposing that you could access your ProgressBar in this point
pBar.Maximum = sCount; 
pBar.Minimum = 0;
for (int i = 0; i < sCount; i++)
{
    backgroundWrkSendPOST.ReportProgress(i); 
}