Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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中实现progressbar的正确方法#_C#_Winforms_Multithreading_Backgroundworker - Fatal编程技术网

C# 在C中实现progressbar的正确方法#

C# 在C中实现progressbar的正确方法#,c#,winforms,multithreading,backgroundworker,C#,Winforms,Multithreading,Backgroundworker,我正在学习winforms,我为自己设定了一个简单的目标,即制作一个从空到满的progressbar。以下是我畸形的尝试: public partial class Form1 : Form { static BackgroundWorker bw = new BackgroundWorker(); public Form1() { InitializeComponent(); bw.DoWork += bw_DoWork;

我正在学习winforms,我为自己设定了一个简单的目标,即制作一个从空到满的progressbar。以下是我畸形的尝试:

public partial class Form1 : Form
{
    static BackgroundWorker bw = new BackgroundWorker();

    public Form1()
    {
        InitializeComponent();
        bw.DoWork += bw_DoWork;
        bw.RunWorkerAsync();
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        for(int i=0; i<100; ++i)
        {
            progressBar1.PerformStep();
            Thread.Sleep(10);
        }
    }
}
公共部分类表单1:表单
{
静态BackgroundWorker bw=新的BackgroundWorker();
公共表格1()
{
初始化组件();
bw.DoWork+=bw_DoWork;
RunWorkerAsync();
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{

对于后台线程中的(inti=0;i,调用
thread.Sleep

如果这是一个占位符,您可以用实际工作安全地替换它

但是,您不能直接从后台线程操作ProgressBar(或任何其他控件)。
相反,您应该使用
BackgroundWorker
的内置进度功能来控制进度条


如果你只是想制作一个毫无意义的进度,你应该使用WinForms
定时器,而不是
BackgroundWorker
,你已经做得差不多了。
BackgroundWorker
已经有了一个报告进度的内置机制

public Form1()
{
    bw1.WorkerReportsProgress = true;
    bw1.ProgressChanged += bw1_ProgressChanged;
    bw1.DoWork += bw1_DoWork;

    bw1.RunWorkerAsync();
}

private void bw1_DoWork(object sender, DoWorkEventArgs e)
{
    var worker = sender as BackgroundWorker;

    while (workNotDone)
    {
        //Do whatever work
        worker.ReportProgress(CalculateProgressDonePercentage());
    }
}

private void bw1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //This is called on GUI/main thread, so you can access the controls properly
    progressBar.Value = e.ProgressPercentage;
}

当然,除非您只是尝试在不实际报告任何进度的情况下设置进度条的动画,在这种情况下,您可能应该只使用
字幕
类型,该类型将自动滚动进度条,而不执行任何操作。或者只使用带有
线程的后台线程。Sleep()

如果您只是想在执行耗时任务时测试更新UI,
Thread.Sleep
是可以的。对于非普通程序,您总是可以在此处找到一些任务来代替

但是,您不应该直接在
BackgroundWorker.DoWork
中更新进度条,因为Windows要求必须在UI线程而不是后台线程上调用更新UI。相反,请调用
BackgroundWorker.ReportProgress
方法。始终在
BackgroundWorker.ProgressChanged
事件中更新UI。


您可以在这里看到示例:

Try.Or.Or。或者,如果您想做一些激动人心的事情,尝试运行一个算法并使用秒表对象来测量该算法中的一个步骤,那么您可以计算该步骤将执行多少次,这样您就可以得到总时间,并基于此使用您的数学技能来获得当前Sta的百分比葛,所以我想这会让你的老师满意的。