C#:Winforms进度条

C#:Winforms进度条,c#,winforms,C#,Winforms,我的主窗体(UI线程)上有一个自定义进度条。我创建了一个后台线程来读取CSV文件中的输入数据(单击菜单),并使用匿名委托更新进度条的值。只有第一次,一切都很好 如果我重复读取数据的过程(从菜单单击),数据将按其应该的方式读取(读取时我将其转储到控制台),但进度条根本不会显示。我是不是遗漏了什么 基本上,进度条只工作一次,如果我重复读取操作,则不会显示进度条 如有任何建议,将不胜感激。多谢各位 我使用的代码基本上来自William Daniel。这是: class CustomProgressBa

我的主窗体(UI线程)上有一个自定义进度条。我创建了一个后台线程来读取CSV文件中的输入数据(单击菜单),并使用匿名委托更新进度条的值。只有第一次,一切都很好

如果我重复读取数据的过程(从菜单单击),数据将按其应该的方式读取(读取时我将其转储到控制台),但进度条根本不会显示。我是不是遗漏了什么

基本上,进度条只工作一次,如果我重复读取操作,则不会显示进度条

如有任何建议,将不胜感激。多谢各位

我使用的代码基本上来自William Daniel。这是:

class CustomProgressBar : ProgressBar
{
    public CustomProgressBar()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        // None... Helps control the flicker.
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        const int inset = 2;
        using (Image offscreenImage = new Bitmap(this.Width, this.Height))
        {
            using (Graphics offscreen = Graphics.FromImage(offscreenImage))
            {
                offscreen.Clear(Color.DarkBlue);
                Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);

                if (ProgressBarRenderer.IsSupported)
                    ProgressBarRenderer.DrawHorizontalBar(offscreen, rect);

                rect.Inflate(new Size(-inset, -inset));  // Deflate inner rectangle
                rect.Width = (int)(rect.Width * ((double)this.Value / this.Maximum));
                if (rect.Width == 0) rect.Width = 1;
                LinearGradientBrush brush = new LinearGradientBrush(new Point(0, 0),
                      new Point(0, Height - inset * 2), BackColor, ForeColor);
                offscreen.FillRectangle(brush, inset, inset, rect.Width, rect.Height);

                e.Graphics.DrawImage(offscreenImage, 0, 0);
                offscreenImage.Dispose();
            }
        }
    }
}
使用代码为:

 // ... update progress bar value
 this.pBar.Invoke((MethodInvoker)delegate
 {
     this.pBar.Value = (int) ( ((double) nRows) * 100.0 / ((double) fileLines) );
 });

我也使用这个.pBar.Show()来显示它,我也使用这个.pBar.hide()来隐藏它。

首先,确保其他线程总是通过方法更新进度条。我不确定你所说的“我使用匿名委托更新进度条的值”是否就是这个意思


另外,您是否记得在第二次运行之前重置进度条?

在此处显示一些代码将非常有用。查看代码将非常有用。一般回答:应用程序中必须存在可能未重置的状态。此处没有足够的信息--您可以发布代码吗?如果您使用标准进度条,直到基本应用程序正常工作,效果会更好。否则,每个人都会质疑你的自定义倒钩,确保你完成后重置进度条。调试代码,找出它不工作的原因,找出它失败的地方。我这样做。我使用//。。。将进度条重置为最小值this.pBar.value=this.pBar.minimum;