简介
我正在尝试使用.Net
制作WinForms
应用程序。
我正在使用教程from here,其中显示了BackgroundWorker
和ProgressBar
集成。
我向窗体添加了ProgressBar
和BackgroundWorker
控件。名称与示例中的名称相同。此外,我将BackgroundWorker
的WorkerReportProgress
属性设置为True
。没有显示错误,项目编译成功。
问题
问题是- ProgressBar不会移动。然而,当手动点击时,它会移动。
我错过了什么?
编号
- 表格1.cs *
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, System.EventArgs e)
{
// Start the BackgroundWorker.
BackgroundWorker1.RunWorkerAsync();
}
private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
// Wait 500 milliseconds.
Thread.Sleep(500);
// Report progress.
BackgroundWorker1.ReportProgress(i);
}
}
private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Change the value of the ProgressBar to the BackgroundWorker progress.
progressBar1.Value = e.ProgressPercentage;
// Set the text.
this.Text = e.ProgressPercentage.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
progressBar1.PerformStep();
}
}
}
更新
已从DoWork
和ProgressChanged
中删除progressBar1.PerformStep();
。问题仍然存在(进度栏不移动)。
谢谢你的想法,到目前为止,将在星期一进一步研究。
2条答案
按热度按时间2exbekwf1#
确保将事件处理程序附加到
ProgressChanged
和DoWork
之后:1.从
DoWork
事件处理程序中删除progressBar1.PerformStep()
。1.然后在
ProgressChanged
事件处理程序中仅使用progressBar1.Value = e.ProgressPercentage;
。eivnm1vs2#
几年前,我写了一个简单的多线程进度条码。希望它能帮助你:
通常,当从Alterante线程编写UI元素时,您必须使用Invoke.BackgroundWorker很好,并在创建它的线程(应该是GUI线程)上调用“ReportProgress”和“RunWorkerCompleted”事件,因此您还不必处理多线程的那部分问题。
捕捉任何异常也是很好的,这些异常通常会逃脱DoWork并被吞掉,并在Completed Event Args中将它们暴露给您。吞掉异常是多线程的一个大问题。
核心问题是,你的循环会因为一个异常而中断。在DoWork事件**内部调用
progressBar1.PerformStep();
**必须抛出一个“CrossThreadException”。BackgroundnWorker会立即结束(由于一个异常)。RunWorker completed事件会在i为初始值时触发。