C# 如何在非长度特定任务或并行循环中使用进度条?

C# 如何在非长度特定任务或并行循环中使用进度条?,c#,progress-bar,task,C#,Progress Bar,Task,我需要windows窗体应用程序中的进度条,但我的进程不是特定于长度的,因此我无法将最大值设置为进度条 我必须使用LongProcess类运行方法运行时间来增加进度条值 void start_click() { button1.Enabled=false; Task.Factory.StartNew(()=>{ Parallel.Foreach(files,f=>{ LongProcess process =new LongP

我需要windows窗体应用程序中的进度条,但我的进程不是特定于长度的,因此我无法将最大值设置为进度条

我必须使用LongProcess类运行方法运行时间来增加进度条值

void start_click()
{
    button1.Enabled=false;

    Task.Factory.StartNew(()=>{
        Parallel.Foreach(files,f=>{
            LongProcess process =new LongProcess(); // Long-running process (is not my control)
            process.Run(f); 
                    //progressBarValueIncrement();

        });
    }).ContinueWith(t=>{
        // completed
        BeginInvoke(new Action(() =>    button1.Enabled=true));
    });
}

如何实现这一点?

您可以使用剩余未填充值的某个百分比来增加进度条。这意味着进度条从未填满,而且会越来越慢地填满

因此,在第一个增量中,您将填充进度条的50%,然后在下一个增量中,您将填充剩余进度条的50%,因此,总进度条的75%将填充25%,剩余进度条的50%,总进度条的87.5%,以此类推

您可能希望将其分段,以便您使用的%年龄是基于进度条的填满程度,因此从开始时的5%开始,这样它不会在开始时填满得太快,然后移动到更高的百分比,这样您可以看到进度条仍在接近结束时移动


如果你不知道某件事需要多长时间,进度条是否合适?也许你会更喜欢显示正在发生的事情,但不是完成了多少…

你可以使用循环进度条,它只显示正在进行的事情,你也可以估计你的应用程序运行时间,并在最后一步停止,然后在进度完成后停止。也许我这里遗漏了一些东西,但是如果你知道使用foreach迭代的文件数,这不是每次完成都会增加1/计数的小增量吗?@MarkSmith我应该在运行LongProcess时增加进度值,而不是在进程之后如果你有大量文件,为什么不在每次文件完成时更新栏?我认为,对于进度条来说,任何超过25个文件的粒度都足够了。在这种情况下,每1%而不是每4%更新一次是否真的那么重要?除非所有25个都同时运行,但这不太可能。我还怀疑进度条UI模式在这种情况下是否合适。