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,直到处理离开该方法。
查看三种不同的解决方案 ,其中明确使用了线程、BackgroundWorker
和 async
-await
技术。
我有这个代码:
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,直到处理离开该方法。
查看三种不同的解决方案 BackgroundWorker
和 async
-await
技术。