C# 后台忙时如何使用进度条

C# 后台忙时如何使用进度条,c#,winforms,progress-bar,C#,Winforms,Progress Bar,我想为我的应用程序设置一个进度条 我正在使用后台从我的服务器下载一些文件 如果我能为此设置一个进度条,那就太好了 我知道怎么用 ProgressBar.Value = 5; 还有更多 但我想用进度条。” 我正在使用此代码作为进度条 private void bgDownload_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.downloadProgressBar.Value = e.ProgressP

我想为我的应用程序设置一个进度条

我正在使用后台从我的服务器下载一些文件

如果我能为此设置一个进度条,那就太好了

我知道怎么用

ProgressBar.Value = 5;
还有更多

但我想用进度条。”

我正在使用此代码作为进度条

private void bgDownload_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    this.downloadProgressBar.Value = e.ProgressPercentage;
}
但它不起作用

谁能说我该怎么做呢


提前感谢

如果您在后台进行处理,UI将在其完成之前不会更新

因此,您需要做的是创建一个单独的线程,处理将在其中进行,并在该线程内更新进度条。在主线程中,不要做任何事情

要从另一个线程中更新进度条,您需要一个委托(否则会出现运行时错误)


希望这能让您开始。

您可以尝试使用BackgroundWorker下载一些文件

所以背景下载不会影响你的进程吧

    private void btnDownLoad_Click(System.Object sender, 
        System.EventArgs e)
    {

        // Start the asynchronous operation.
        backgroundWorkerDownLoadFile.RunWorkerAsync();
    }



    private void backgroundWorkerDownLoadFile_DoWork(object sender, 
        DoWorkEventArgs e)
    {   
        // Get the File in Server.
    }

我假设您使用的是后台工作程序组件。因此,您必须从backgroundworker的
DoWork
方法调用
ReportProgress
方法,该方法应更新进度条。请在下面找到MSDN中有关ReportProgress方法的一些参考资料:


除了JKhuang写的内容之外,要更改进度条中的值,您需要添加 委托和回调函数

delegate void SetProgCallback(int newVal);
private void SetProgressbarValue(int newVal)
{
    if (progbar.InvokeRequired)
    {
        SetProgCallback d = SetProgressbarValue;
        Invoke(d, new object[] { newVal });
    }
    else
    {
        //insert your actual code here
    }
}

下面是一个如何做到这一点的示例

    public int ProgressBarPercentage { get; set; }
    public string StatusMessage { get; set; }

    public void StartDownload()
    {
        BackgroundWorker bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        bw.RunWorkerAsync();
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // Run clean up code here once complete (ie make sure progress bar is at 100 percent....
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker bw = sender as BackgroundWorker;

        // Download files here
        List<string> filestoget = new List<string>();
        filestoget.Add("File1");
        filestoget.Add("File2");
        filestoget.Add("File3");
        filestoget.Add("File4");
        filestoget.Add("File5");

        foreach (string file in filestoget)
        {
            // Get File

            // Report output
            int progress = 0; // add soemthing here to calculate your progress
            bw.ReportProgress(progress, string.Format("File {0} downloaded", file));
        }
    }

    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        ProgressBarPercentage = e.ProgressPercentage;
        StatusMessage = e.UserState.ToString();
    }
public int ProgressBarPercentage{get;set;}
公共字符串状态消息{get;set;}
public void StartDownload()
{
BackgroundWorker bw=新的BackgroundWorker();
bw.WorkerReportsProgress=true;
bw.ProgressChanged+=新的ProgressChangedEventHandler(bw\U ProgressChanged);
bw.DoWork+=新DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(bw\u RunWorkerCompleted);
RunWorkerAsync();
}
void bw_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e)
{
//完成后在此处运行清理代码(即确保进度条为100%。)。。。。
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker bw=发送方作为BackgroundWorker;
//在这里下载文件
List filestoget=new List();
filestoget.Add(“File1”);
filestoget.Add(“File2”);
filestoget.Add(“File3”);
filestoget.Add(“File4”);
filestoget.Add(“File5”);
foreach(filestoget中的字符串文件)
{
//获取文件
//报告输出
int progress=0;//在此处添加soemthing以计算进度
ReportProgress(progress,string.Format(“文件{0}下载”,File));
}
}
void bw_ProgressChanged(对象发送方,ProgressChangedEventArgs e)
{
ProgressBarPercentage=e.ProgressPercentage;
StatusMessage=e.UserState.ToString();
}

你能给我提供一些代码吗?因为我不知道进度条,我刚刚看到它。这是不正确的。如果他是在后台这样做的(不同的线程)然后,只要使用BeginInvoke或BackGroundWorker Progress Changed事件将值传递给UI,UI就会更新。或者,您可以使用操作而不是委托.progbar.Invoke(新操作(SetProgressbarValue,新对象[]{newVal}));