foreach中的C#Progressbar值()

时间:2017-01-06 11:18:03

标签: c# foreach progress-bar progress

我有这段代码:

 private void button1_Click(object sender, EventArgs e)
    {
        var max = 0;
        foreach (var address in textBox2.Text.Split(','))
        {
            max = +1;
        }
        var maxp = 100 / max;
        foreach (var address in textBox2.Text.Split(','))
        {
            SendMessage(address);
            progressBar1.Value = +maxp;
        }
    }

它会计算文本框中的电子邮件数量,然后按比例计算。对每个发送的电子邮件添加进度值,问题是当我按下按钮时,进度条不会移动。发送所有电子邮件后,进度条将移至笔画结束。 我该怎么办?

3 个答案:

答案 0 :(得分:2)

这是因为你循环并且ui在同一个线程上执行。当循环繁忙时,它无法更新ui

您可以使用BackgroundWorker在后​​台的其他线程上运行循环,然后使用BackgroundWorker的ProgressChanged事件更新您的进度条。您可以详细了解BackgroundWorkers here

答案 1 :(得分:0)

您再次在UI线程以外的线程上执行代码。在WinForms中,您必须调用UI线程,在WPF中,您必须使用应用程序调度程序。

的WinForms:

Invoke((MethodInvoker) delegate {
    DoSomethingOnUiThread();
});

WPF:

Application.Current.Dispatcher.Invoke(() =>{
  DoSomethingOnUiThread();
});

答案 2 :(得分:0)

您阻止UI线程,以便在处理离开方法之前无法刷新UI。

使用明确使用的线程,BackgroundWorkerasync - await技术,查看三种不同的解决方案here