C# 添加进度条
我有一个windows窗体应用程序,它使用一个类(它的名称是C# 添加进度条,c#,progress-bar,C#,Progress Bar,我有一个windows窗体应用程序,它使用一个类(它的名称是Parser) 这个表单有一个按钮,当我单击windows表单应用程序按钮时,它调用一个解析器类方法 这个方法只是一行接一行地读取文本文件,然后将每一行写入单独的文件 我想在表单中添加一个进度条以显示进度(这是一个非常大的文件) 你知道怎么做吗?我在Parse class 2中有一个属性,它表示文件中的行数,第二个属性表示已经检查了多少行 这是我的按钮2\u单击功能 private void button2_Click(object s
Parser
)
这个表单有一个按钮,当我单击windows表单应用程序按钮时,它调用一个解析器类方法
这个方法只是一行接一行地读取文本文件,然后将每一行写入单独的文件
我想在表单中添加一个进度条以显示进度(这是一个非常大的文件)
你知道怎么做吗?我在Parse class 2中有一个属性,它表示文件中的行数,第二个属性表示已经检查了多少行
这是我的按钮2\u单击功能
private void button2_Click(object sender, EventArgs e)
{
if (this.textBox1 != null & this.textBox2 != null)
{
inst.init(this.textBox1.Text, this.textBox2.Text);
//this.progressBar1.Show();
inst.ParseTheFile();
System.Windows.Forms.MessageBox.Show("Parsing finish successfully");
}
}
通常情况下,你应该继续写一些你已经尝试过的东西。
由于我认为您更倾向于“开始”,我建议您查看事件及其进度更改的事件/系统(这里是一个示例)
当然,您必须将您的ParseTheFile代码移到这个位置
对于更高级的内容,有几个选项:
- 将参数添加到用于设置进度的
ParseTheFile
(例如a)
- 从
ParseTheFile
返回一个指示进度的
- 使用一些静态服务
解析文件用于指示进度(未通知)
- …(我相信其他人会找到更多的选择)
(如果您使用另一个线程,请不要使用此选项中的大多数返回您的UI线程以设置进度条值,如果文件太大,我建议您使用另一个线程)
对于初学者,我会选择backgroundworker——我想如果你不想在第一次跑步时就坚持(设计模式/原则)也没关系;)只要用数学来计算百分比就可以了
比如:
并可能将int.ParseTheFile()放入后台工作程序和/或线程中。您可以执行以下操作:
private void button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem((obj) =>
{
var lines = File.ReadLines(@"D:\test.txt");
var count = lines.Count();
for(int i = 0; i < count; i++)
{
// some parse work
Invoke(new Action(() =>
{
progressBar1.Value = (i * 100) / count;
}));
}
});
}
你应该给你的控件命名。@HansPassant,怎么回事?所有的代码都在后台线程上执行。它不会阻塞UI线程。它会向UI线程发送调用请求,不再执行常规的低优先级任务。比如绘画。@HansPassant,Touché。它会在运行invoke方法非常,非常短(0.1ms?可能甚至更少)。但是,我仍然认为它比整个UI线程一直被阻塞要好。而且你没有注意到短暂冻结(至少我没有注意到)。Parser类发生了什么事?为什么在GUI类中进行解析?@Stealthrabi,我假设OP知道//一些解析工作应该用对Parser方法的调用等来代替。-我不确定GUI类是什么意思?
private void button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem((obj) =>
{
var lines = File.ReadLines(@"D:\test.txt");
var count = lines.Count();
for(int i = 0; i < count; i++)
{
// some parse work
Invoke(new Action(() =>
{
progressBar1.Value = (i * 100) / count;
}));
}
});
}
private void button1_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem((obj) =>
{
var lines = File.ReadLines(@"D:\test.txt");
var count = lines.Count();
Parallel.For(0, count, i =>
{
// some parse work
Invoke(new Action(() =>
{
progressBar1.Value = (i * 100) / count;
}));
});
});
}