我有这段代码:
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;
}
}
它会计算文本框中的电子邮件数量,然后按比例计算。对每个发送的电子邮件添加进度值,问题是当我按下按钮时,进度条不会移动。发送所有电子邮件后,进度条将移至笔画结束。 我该怎么办?
答案 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。
使用明确使用的线程,BackgroundWorker
和async
- await
技术,查看三种不同的解决方案here。