C# 未使用BackgroundWorker更新进度条

C# 未使用BackgroundWorker更新进度条,c#,wpf,progress-bar,C#,Wpf,Progress Bar,我试图读取一个文件并在屏幕上显示进度。 它应该显示在进度条(进度)和文本框(进度文本)上 这是我正在使用的代码: public partial class MainWindow : Window { public static List<String> file = new List<String>(); public long currentPosition = 0; String line; long length; publi

我试图读取一个文件并在屏幕上显示进度。 它应该显示在进度条(进度)和文本框(进度文本)上

这是我正在使用的代码:

public partial class MainWindow : Window
{
    public static List<String> file = new List<String>();
    public long currentPosition = 0;
    String line;
    long length;
    public BackgroundWorker worker = new BackgroundWorker();


    public MainWindow()
    {
        InitializeComponent();

        worker.WorkerReportsProgress = true;
        worker.DoWork += worker_DoWork;
        worker.ProgressChanged += worker_ProgressChanged;
    }

    private void Start(object sender, RoutedEventArgs e)
    {
        worker.RunWorkerAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker bg = sender as BackgroundWorker;

        Dispatcher.Invoke(() =>
        {
            progress.Minimum = 0;
            progress.Maximum = 100;

            FileInfo fi = new FileInfo(upload.Text);
            length = fi.Length;

            int percent;


            using (StreamReader sr = new StreamReader(upload.Text, System.Text.Encoding.ASCII))
            {
                while (sr.EndOfStream == false)
                {
                    line = sr.ReadLine();
                    file.Add(line);
                    currentPosition += line.Count();

                    percent = (int)(100.0 / length * currentPosition);
                    bg.ReportProgress(percent);
                }
            }
        });
    }

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progress.Value = e.ProgressPercentage;
        progress_text.Text = "reading " + currentPosition + " out of " + length;
    }
}
公共部分类主窗口:窗口
{
公共静态列表文件=新列表();
公共长currentPosition=0;
弦线;
长度长;
public BackgroundWorker worker=新的BackgroundWorker();
公共主窗口()
{
初始化组件();
worker.WorkerReportsProgress=true;
worker.DoWork+=worker\u DoWork;
worker.ProgressChanged+=worker\u ProgressChanged;
}
私有无效开始(对象发送方、路由目标)
{
worker.RunWorkerAsync();
}
无效工作线程(对象发送器,工作线程目标)
{
BackgroundWorker bg=发送方作为BackgroundWorker;
Dispatcher.Invoke(()=>
{
进度。最小值=0;
进度。最大值=100;
FileInfo fi=新的FileInfo(upload.Text);
长度=fi.长度;
整数百分比;
使用(StreamReader sr=新的StreamReader(upload.Text、System.Text.Encoding.ASCII))
{
while(sr.EndOfStream==false)
{
line=sr.ReadLine();
文件。添加(行);
currentPosition+=line.Count();
百分比=(整数)(100.0/长度*当前位置);
bg.报告进度(百分比);
}
}
});
}
void worker\u ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
进度值=e.ProgressPercentage;
progress_text.text=“reading”+当前位置+“超出”+长度;
}
}
XAML:


当我在debug中运行它时,它似乎正在工作。 但是只有当文件被完全读取时,进度条和文本框才会更新

我学习了一些教程,例如:

但是我想不出来

我想它很小,但我找不到

谢谢大家!

请尝试以下代码:

private void Start(object sender, RoutedEventArgs e)
    {
 progress.Minimum = 0;
            progress.Maximum = 100;
        worker.RunWorkerAsync();
    }



BackgroundWorker bg = sender as BackgroundWorker;
            FileInfo fi = new FileInfo(@"File");
            length = fi.Length;

            int percent;


            using (StreamReader sr = new StreamReader(@"File", System.Text.Encoding.ASCII))
            {
                while (sr.EndOfStream == false)
                {
                    line = sr.ReadLine();
                    file.Add(line);
                    currentPosition += line.Count();

                    percent = (int)(currentPosition / length) * 100;
                    bg.ReportProgress(percent);
                    Thread.Sleep(100);
                }
            }
请尝试以下代码:

private void Start(object sender, RoutedEventArgs e)
    {
 progress.Minimum = 0;
            progress.Maximum = 100;
        worker.RunWorkerAsync();
    }



BackgroundWorker bg = sender as BackgroundWorker;
            FileInfo fi = new FileInfo(@"File");
            length = fi.Length;

            int percent;


            using (StreamReader sr = new StreamReader(@"File", System.Text.Encoding.ASCII))
            {
                while (sr.EndOfStream == false)
                {
                    line = sr.ReadLine();
                    file.Add(line);
                    currentPosition += line.Count();

                    percent = (int)(currentPosition / length) * 100;
                    bg.ReportProgress(percent);
                    Thread.Sleep(100);
                }
            }

您的代码有以下问题:

(int)(a/b)*100将首先计算
a/b
,然后将其转换为
int
,然后再转换为
*100
,因此在
a
到达
b
之前,
a/b
将始终是
0.
(int)(a/b)
将始终为
0
,因此最终值
0*100
将始终为0

a=b
时,
(int)(a/b)
突然变为
1
,最终值变为100。这就是为什么在文件被完全读取之前,进度条不会被更新的原因

因此,您应该使用
percent=(int)(当前位置*100/长度)


或者按照@jmc在评论中的建议:使用
percent=(int)(100.0/length*currentPosition)

您的代码存在以下问题:

(int)(a/b)*100将首先计算
a/b
,然后将其转换为
int
,然后再转换为
*100
,因此在
a
到达
b
之前,
a/b
将始终是
0.
(int)(a/b)
将始终为
0
,因此最终值
0*100
将始终为0

a=b
时,
(int)(a/b)
突然变为
1
,最终值变为100。这就是为什么在文件被完全读取之前,进度条不会被更新的原因

因此,您应该使用
percent=(int)(当前位置*100/长度)


或者按照@jmc在评论中的建议:使用
percent=(int)(100.0/length*currentPosition)

我认为你做错了。你能试试百分比=(整数)(100.0/长度*当前位置)吗;谢谢,更正了。但最重要的是,在文件读取过程中,用户界面没有更新。@Bolu它与您下面的答案有什么不同?@Bolu您是说100.0不是小数点吗?@Bolu接受道歉:)我认为您做错了%。你能试试百分比=(整数)(100.0/长度*当前位置)吗;谢谢,更正了。但最重要的是,在文件读取过程中,用户界面没有更新。@Bolu它与下面的答案有什么不同?@Bolu你是说100.0不是小数吗?@Bolu接受道歉:)我必须将每个用户界面引用从DoWork函数中删除,然后更新。Thread.Sleep(100)会大大降低它的速度,Thread.Sleep(1)对于一个1.5Mb的文件需要大约1分钟的时间。我必须将每个UI引用从DoWork函数中删除,然后更新它。Thread.Sleep(100)会大大降低速度,Thread.Sleep(1)对于1.5Mb文件大约需要1分钟。