foreach() 中的 C# 进度条值

C# Progressbar value in foreach()

我有这个代码:

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

它计算文本框中有多少封邮件,然后做一个比例。发送的每封电子邮件都会添加进度值,问题是当我按下按钮时,进度条不会移动。发送完所有电子邮件后,进度条将移动到笔划的末尾。 我该怎么办?

发生这种情况是因为您的循环和 ui 在同一个线程上执行。循环繁忙时,无法更新 ui

您可以使用 BackgroundWorker 到 运行 后台不同线程上的循环,然后使用 BackgroundWorker 的 ProgressChanged 事件来更新您的进度条。您可以了解有关 BackgroundWorkers 的更多信息 here

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

WinForms:

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

WPF:

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

您阻塞了 UI 线程,因此它无法刷新 UI,直到处理离开该方法。

查看三种不同的解决方案 ,其中明确使用了线程、BackgroundWorkerasync-await 技术。