C#进度条不';下载时不更新

C#进度条不';下载时不更新,c#,.net,download,ftp,progress-bar,C#,.net,Download,Ftp,Progress Bar,我正在使用BackgroundWorker从ftp服务器下载一个文件,但只有在文件下载完成后,进度才会更新 进度条保持为0,在下载期间冻结,并设置为100 这是我的密码: private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { FtpWebRequest request = (FtpWebRequest)WebRequest.Create

我正在使用BackgroundWorker从ftp服务器下载一个文件,但只有在文件下载完成后,进度才会更新

进度条保持为0,在下载期间冻结,并设置为100

这是我的密码:

    private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(activeDownload.ftpPath);
        request.Credentials = new NetworkCredential(ftpUser, ftpPass);
        request.Method = WebRequestMethods.Ftp.DownloadFile;

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();

        using (FileStream writer = new FileStream(activeDownload.localPath, FileMode.Create)) {

            long length = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[2048];
            long bytesread = 0;
            backgroundWorker1.ReportProgress(0);

            readCount = responseStream.Read(buffer, 0, bufferSize);
            while (readCount > 0) {
                bytesread += readCount;
                writer.Write(buffer, 0, readCount);
                backgroundWorker1.ReportProgress((int)(bytesread / activeDownload.fileSize) * 100);
                readCount = responseStream.Read(buffer, 0, bufferSize);
            }
        }

        response.Close();
        responseStream.Close();
    }

    private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) {
        progressBar1.Value = e.ProgressPercentage;
    }

我做错了什么?任何帮助都将不胜感激。

设置值,然后在下面运行

progressbar1.PerformStep()
你也可以

progressBar1.Refresh()

设置该值,然后在下面运行

progressbar1.PerformStep()
你也可以

progressBar1.Refresh()

查看以下链接是否有帮助:

下面是我在一个项目中实现的示例代码:

public ProcessFilesClass()
    {
        InitializeComponent();
        backgroundWorker1= new BackgroundWorker();
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        var backgroundWorker = sender as BackgroundWorker;
        worker.WorkerReportsProgress = true;
        WorkerProcessMethod();
    }

private void WorkerProcessMethod()
    {
            //Process items in list box
            int itemsToProcess = someListBox.Items.Count;
            for (int i = 0; i < itemsToProcess; i++)
                {
                    int findPercentage = ((i + 1) * 100) / someListBox.Items.Count;
                     if (backgroundWorker1 != null) { backgroundWorker1.ReportProgress(findPercentage, null); }
                }
    }

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
           progressBar1.Value = e.ProgressPercentage;

    }

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
          //DisableProgressBarStatus
           this.Close();            
    }
publicprocessFileClass()
{
初始化组件();
backgroundWorker1=新的BackgroundWorker();
backgroundWorker1.DoWork+=新的DoWorkerVenthandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(backgroundWorker1\U RunWorkerCompleted);
backgroundWorker1.ProgressChanged+=新的ProgressChangedEventHandler(backgroundWorker1\u ProgressChanged);
}
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
var backgroundWorker=发送方作为backgroundWorker;
worker.WorkerReportsProgress=true;
WorkerProcessMethod();
}
私有void WorkerProcessMethod()
{
//处理列表框中的项目
int itemsToProcess=someListBox.Items.Count;
for(int i=0;i
查看以下链接是否有帮助:

下面是我在一个项目中实现的示例代码:

public ProcessFilesClass()
    {
        InitializeComponent();
        backgroundWorker1= new BackgroundWorker();
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        var backgroundWorker = sender as BackgroundWorker;
        worker.WorkerReportsProgress = true;
        WorkerProcessMethod();
    }

private void WorkerProcessMethod()
    {
            //Process items in list box
            int itemsToProcess = someListBox.Items.Count;
            for (int i = 0; i < itemsToProcess; i++)
                {
                    int findPercentage = ((i + 1) * 100) / someListBox.Items.Count;
                     if (backgroundWorker1 != null) { backgroundWorker1.ReportProgress(findPercentage, null); }
                }
    }

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
           progressBar1.Value = e.ProgressPercentage;

    }

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
          //DisableProgressBarStatus
           this.Close();            
    }
publicprocessFileClass()
{
初始化组件();
backgroundWorker1=新的BackgroundWorker();
backgroundWorker1.DoWork+=新的DoWorkerVenthandler(backgroundWorker1_DoWork);
backgroundWorker1.RunWorkerCompleted+=新的RunWorkerCompletedEventHandler(backgroundWorker1\U RunWorkerCompleted);
backgroundWorker1.ProgressChanged+=新的ProgressChangedEventHandler(backgroundWorker1\u ProgressChanged);
}
私有void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
var backgroundWorker=发送方作为backgroundWorker;
worker.WorkerReportsProgress=true;
WorkerProcessMethod();
}
私有void WorkerProcessMethod()
{
//处理列表框中的项目
int itemsToProcess=someListBox.Items.Count;
for(int i=0;i
好的,结果证明我做的一切都很好,但我分析的百分比是错误的。除以两个long(bytesread和activeDownload.fileSize)返回0。因此,进展率一直停留在0%

以下是正确的解析:

backgroundWorker1.ReportProgress(Convert.ToInt32((((double)bytesread / activeDownload.fileSize) * 100)));

好吧,结果证明我做的一切都很好,但我分析的百分比是错误的。除以两个long(bytesread和activeDownload.fileSize)返回0。因此,进展率一直停留在0%

以下是正确的解析:

backgroundWorker1.ReportProgress(Convert.ToInt32((((double)bytesread / activeDownload.fileSize) * 100)));

请问这是一个什么样的项目?某些项目(如VSTO)在BGW中的行为与预期不符,需要其他功能才能正常工作。如果问题在于您提供给
ReportProgress
的信息或进度条呈现,您是否进行了调试?添加一些
Debug.WriteLine
+我们需要,我已经找到了解决办法。下面是更多的细节。你能说说这是一个什么样的项目吗?某些项目(如VSTO)在BGW中的行为与预期不符,需要其他功能才能正常工作。如果问题在于您提供给
ReportProgress
的信息或进度条呈现,您是否进行了调试?添加一些
Debug.WriteLine
+我们需要,我已经找到了解决办法。更多细节见下文。