Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加进度条_C#_Progress Bar - Fatal编程技术网

C# 添加进度条

C# 添加进度条,c#,progress-bar,C#,Progress Bar,我有一个windows窗体应用程序,它使用一个类(它的名称是Parser) 这个表单有一个按钮,当我单击windows表单应用程序按钮时,它调用一个解析器类方法 这个方法只是一行接一行地读取文本文件,然后将每一行写入单独的文件 我想在表单中添加一个进度条以显示进度(这是一个非常大的文件) 你知道怎么做吗?我在Parse class 2中有一个属性,它表示文件中的行数,第二个属性表示已经检查了多少行 这是我的按钮2\u单击功能 private void button2_Click(object s

我有一个windows窗体应用程序,它使用一个类(它的名称是
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;
            }));
        });
    });
}