Wpf ProgressBar 在线程操作期间不更新

问题描述 投票:0回答:1

我有一个带有进度条的 C# wpf 项目。 我试图在线程操作期间更新进度条,但没有任何反应。 使用调度程序应该可以完成这项工作,但它不起作用。 这是示例代码: 非常感谢!

private async void search(string[] files)
{
    progressBar.Maximum = files.Length;
    List<System.Threading.Tasks.Task> searchTasks = new List<System.Threading.Tasks.Task>();
    foreach (string file in files)
    {
        searchTasks.Add(Task.Run(() =>
        {
            this.Dispatcher.Invoke(() =>
            {
                progressBar.Value = progressBar.Value + 1;
                File.ReadAllLines(file);
                //do somthing with the lines
            });
        }));
    }
    await System.Threading.Tasks.Task.WhenAll(searchTasks);
    progressBar.Value = 0;
}
wpf multithreading progress-bar dispatcher file.readalllines
1个回答
0
投票

您的实现问题是您正在尝试运行任务列表。执行任务时,所有任务都会在线程池上同时运行。

因此,您的所有任务可能会同时执行,并且很快就会完成。

您看不到 UI 进度条更新的原因是 UI 线程本身正在读取文件,这会挂起您的 Ui。在所有任务完成之前,UI 不会更新。当所有任务完成后,您将再次将该值设置为 0。因此用户无法观察到。

你可以尝试什么:

foreach (string file in files)
{
    searchTasks.Add(Task.Run(() =>
    {
        this.Dispatcher.Invoke(() =>
        {
            progressBar.Value = progressBar.Value + 1;
        });
            File.ReadAllLines(file);
            //do somthing with the lines
    }));
}
© www.soinside.com 2019 - 2024. All rights reserved.