背景繁忙时如何使用进度条

时间:2011-11-20 09:02:53

标签: c# winforms progress-bar

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

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

如果我为此设置进度条会很好。

我知道要使用

ProgressBar.Value = 5;

等等。

但我想使用进度条。'

我将此代码用于进度条

private void bgDownload_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    this.downloadProgressBar.Value = e.ProgressPercentage;
}

但它不起作用。

任何人都可以说我该怎么做。

提前致谢

5 个答案:

答案 0 :(得分:1)

如果您在后台进行处理,则UI将不会更新,直到结束。

所以你需要做的是创建一个单独的线程,处理将在其中发生,并在该线程内更新进度条。在主线程中没有做任何事情。

要从另一个线程中更新进度条,您将需要一个委托(或者您将收到运行时错误)。

希望这可以帮助你开始。

答案 1 :(得分:0)

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

因此,backgroud下载不会影响您的Process Bar。

    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.
    }

答案 2 :(得分:0)

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

http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

答案 3 :(得分:0)

除了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
    }
}

答案 4 :(得分:0)

以下是如何执行此操作的示例。

    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();
    }